En esta práctica abordaremos un caso real de minería de datos donde tenemos que poner en juego conceptos como el ciclo de vida de un proyecto de minería de datos, desde el objetivo del proyecto hasta la implementación del conocimiento encontrado, pasando por la preparación, limpieza de los datos, conocimiento de los datos, generación del modelo, interpretación y evaluación. Esta práctica se dividirá en dos partes: esta primera en la que abordaremos las primeras fases del proceso, desde los objetivos hasta la preparación de los datos, y una segunda parte en la que seguiremos con el resto del proceso.
El objetivo de esta primera parte de la práctica consiste en seleccionar uno o varios juegos de datos, y realizar las tareas de preparación y análisis exploratorio con el objetivo de disponer de datos listos para después.
Por su parte, en la segunda fase de la práctica, se aplicarán algoritmos no supervisados (clustering) y supervisados (regresión o clasificación), demostrando la correcta asimilación de todos los aspectos trabajados durante el semestre.
El juego de datos seleccionado para esta práctica contiene información acerca de distintos puestos de trabajo. En concreto, contiene datos sobre títulos de trabajo, requisitos de experiencia laboral, habilidades clave, categorías de roles, ubicaciones, áreas funcionales, industrias, roles, longitudes, latitudes y salarios. Dicho conjunto de datos ha sido obtenido de la plataforma Kaggle, una comunidad en línea de científicos de datos y profesionales del aprendizaje automático (https://www.kaggle.com/datasets/thedevastator/predicting-job-titles-from-resumes).
Dado este juego de datos, el problema a resolver consistirá en predecir el salario de un puesto de trabajo. Para ello, en primer lugar, se debe preparar correctamente el juego de datos, realizando la debida limpieza de datos, así como discretización y normalización en caso de ser necesaria y análisis estadístico de atributos.
Una vez preparado el juego de datos, en la segunda fase de la práctica se aplicarán modelos de aprendizaje automático supervisados y no supervisados para predecir el salario de un puesto de trabajo, tema en el que se profundizará en la siguiente entrega.
Queremos hacer una primera aproximación al conjunto de datos escogido y responder a las preguntas más básicas: ¿Cuánto registros tiene? ¿Cuántas variables? ¿De qué tipología son? ¿Cómo se distribuyen los valores de las variables? ¿Hay problemas con los datos, por ejemplo, campos vacíos? ¿Puedo intuir ya el valor analítico de los datos? ¿Qué primeras conclusiones puedo extraer?
El primer paso para realizar un análisis exploratorio es cargar el fichero de datos.
# Cargar datos
path = 'jobss.CSV'
data <- read.csv(path, row.names=NULL)
Verificamos la estructura del juego de datos. Vemos el número de columnas que tenemos y ejemplos de los contenidos de las filas.
# Mostrar estructura de datos
print(str(data))
## 'data.frame': 500 obs. of 12 variables:
## $ Job.Title : chr " Digital Media Planner" " Online Bidding Executive" " Trainee Research/ Research Executive- Hi- Tech Operations" " Technical Support" ...
## $ X : logi NA NA NA NA NA NA ...
## $ Job.Experience.Required: chr "5 - 10 yrs" "2 - 5 yrs" "0 - 1 yrs" "0 - 5 yrs" ...
## $ Key.Skills : chr " Media Planning| Digital Media" " pre sales| closing| software knowledge| clients| requirements| negotiating| client| online bidding| good commu"| __truncated__ " Computer science| Fabrication| Quality check| Intellectual property| Electronics| Support services| Research| "| __truncated__ " Technical Support" ...
## $ Role.Category : chr "Advertising" "Retail Sales" "R&D" "Admin/Maintenance/Security/Datawarehousing" ...
## $ Location : chr "Mumbai" "Pune,Pune" "Gurgaon" "Mumbai" ...
## $ Functional.Area : chr "Marketing , Advertising , MR , PR , Media Planning" "Sales , Retail , Business Development" "Engineering Design , R&D" "IT Software - Application Programming , Maintenance" ...
## $ Industry : chr "Advertising, PR, MR, Event Management" "IT-Software, Software Services" "Recruitment, Staffing" "IT-Software, Software Services" ...
## $ Role : chr "Media Planning Executive/Manager" "Sales Executive/Officer" "R&D Executive" "Technical Support Engineer" ...
## $ Longitude : num 72.9 73.9 77 72.9 78.5 ...
## $ Latitude : num 19.1 18.5 28.4 19.1 17.4 ...
## $ sal : int 3855 2639 2156 4059 5347 4838 2585 3914 2111 2359 ...
## NULL
Como se puede apreciar, el juego de datos contiene 500 registros con 12 variables, aunque se observa que una de ellas (variable X) contiene únicamente valores nulos, hecho que trataremos más adelante en el preprocesado de datos. Mientras tanto, procedemos a definir los otros 11 atributos.
Job Title: Título del trabajo (String)
Job Experience Required: Años de experiencia requerida en un trabajo similar
Key Skills: Habilidades clave requeridas para el trabajo (String)
Role Category: Categoría del trabajo (String)
Location: Ubicación del trabajo (String)
Functional Area: Área funcional del puesto (String)
Industry: Industria del trabajo (String)
Role: Función que se desempeña (String)
Longitude: Longitud (distancia en grados del trabajo respecto al meridiano de Greenwich) del trabajo (Float)
Latitude: Latitud (distancia en grados respecto al ecuador) del trabajo (Float)
Sal: Salario bruto al mes (Int)
En el paso anterior se ha observado una variable repleta de valores nulos. A continuación, vamos a ver la cantidad de valores nulos o vacíos en cada atributo:
colSums(is.na(data))
## Job.Title X Job.Experience.Required
## 0 500 0
## Key.Skills Role.Category Location
## 0 0 0
## Functional.Area Industry Role
## 0 0 0
## Longitude Latitude sal
## 27 27 0
colSums(data=="")
## Job.Title X Job.Experience.Required
## 11 NA 0
## Key.Skills Role.Category Location
## 0 37 11
## Functional.Area Industry Role
## 11 11 14
## Longitude Latitude sal
## NA NA 0
Vemos que, efectivamente, la variable X únicamente contiene valores nulos, por lo tanto es una variable que podemos eliminar.
data <- data[,!colnames(data) %in% c("X")]
A continuación, se comprueba si existen errores en variables categóricas, como, por ejemplo, datos mal escritos. Para ello, utilizaremos la función is.character para saber su una columna está compuesta por datos categóricos o no; factor(), que codifica un vector como un factor (estructura de datos utilizada para representar un vector como datos categóricos), para obtener el factor de una columna; y levels() para obtener los valores únicos del factor de cada columna.
if(!require('dplyr')) install.packages('dplyr'); library('dplyr')
for (i in colnames(select_if(data,is.character))){
print(paste("----- ", i, ", num categorias:", length(levels(factor(data[[i]]))), " -----"))
print(levels(factor(data[[i]])))
}
## [1] "----- Job.Title , num categorias: 472 -----"
## [1] ""
## [2] " .NET Developer (asp.net, MVC, C#)"
## [3] " Accepting Application for Intership for Java, PHP, Web Design, Android"
## [4] " Account Assistance"
## [5] " Account Assistant"
## [6] " Account Manager"
## [7] " Accountant - UK Based Accounting"
## [8] " Accounting Specialist"
## [9] " Accounts executive"
## [10] " Accounts Executive For 1-2 Years Experience"
## [11] " ACCOUNTS EXECUTIVES"
## [12] " Accounts Manager"
## [13] " Accounts Manager (male)"
## [14] " Adeeba Group is Currently hiring for US Inbound Tech Process."
## [15] " ADM - External Affairs & CSR - Bangalore"
## [16] " Admin Executive"
## [17] " Agency Manager || Life Insurance ||ahmedabad , Bhopal , Vadodara"
## [18] " Agm Finance for Automobile Company in Kolkata . Salary:7 Lpa"
## [19] " AIT Global India Private Limited is Looking For JAVA Developer."
## [20] " Analyst - Business Intelligence"
## [21] " Andriod Developer"
## [22] " Android developer"
## [23] " Android Developer"
## [24] " Angular Developer - Fulcrum Digital"
## [25] " Animation Resident"
## [26] " Application Tester"
## [27] " Applications Analyst OEE"
## [28] " Architect Junior/ Middle level"
## [29] " ARCHITECTURAL CAD"
## [30] " Asp.net with Angular JS & Html5 - Hyderabad"
## [31] " Assistant Manager "
## [32] " Assistant Manager - HR Operations"
## [33] " Assistant Manager Purchase"
## [34] " Assistant Professor (Grade I)-Theoretical Computer Science"
## [35] " Assistant Restaurant Manager / Restaurant Manager"
## [36] " Assistant Vice President - Stock Broking - Delhi"
## [37] " Associate"
## [38] " Associate Clinical Data Processor"
## [39] " Associate Level 1 - Fund Accounting"
## [40] " Associate Principal Analyst - Network Security Research"
## [41] " Associate Process Consultant"
## [42] " Associate Vice President - Talent Acquisition - Campus Hiring Program"
## [43] " Asst Sales Manager_ API_ Chemical Distribution_ Mumbai"
## [44] " Automation-Expert-Senior-Automation-Expert"
## [45] " AVP- FX MO"
## [46] " Back End Java Developer - Restful Services/soap"
## [47] " Back Office Executive|data Entry Operators|domestic BPO"
## [48] " Backend Developer"
## [49] " BCOM (hiring for Top4) Internal Audit /compliance Call Vikas"
## [50] " BDE- PUNE"
## [51] " BE Chemical - Fresher"
## [52] " BPO Inbound Voice Tech Process - Customer Service Inbound Voice - Appl"
## [53] " Bulk Hiring Travel Sales Consultants US /UK Shifts Call ASAP"
## [54] " Business Advisor"
## [55] " Business Analyst - Structured Finance"
## [56] " Business Associate"
## [57] " Business Development / Corporate Sales"
## [58] " Business Development Executive"
## [59] " Business Development Executive - Kolkata"
## [60] " Business Development Manager"
## [61] " Business Development Manager-digital / Export"
## [62] " Business Development Manager (BDM)"
## [63] " Business Development Manager (eCommerce)"
## [64] " Business Transformation Consultant"
## [65] " CARE Specialist"
## [66] " Centreless Grinding Operator "
## [67] " Chief Engineer"
## [68] " Chinese, Spanish Language Expert (proofcheck Medical Content),"
## [69] " Civil Architect"
## [70] " Clerk - Garh Shankar (Vacancy-1)"
## [71] " Client Relationship Partner"
## [72] " Cloud Engineer Cloud Based IT MNC In Gurgaon , salary 7 - 8 LPA"
## [73] " Clubhouse Manager, Facility Manager,"
## [74] " Cluster Sales Head - Tied Channel & Affinity Alliances - Health Insura"
## [75] " CNC Machine Operator"
## [76] " Cognos TM1 Developer (4 6 years)"
## [77] " Community Manager,"
## [78] " Compiler- Support Engineer"
## [79] " computer operator"
## [80] " Consultant"
## [81] " Content Editor"
## [82] " Content Writer"
## [83] " Content Writer Required for a Monthly Magazine"
## [84] " Corporate-Day Care Manager."
## [85] " Corporate Head - Operations"
## [86] " Credit Control - Manager / Asst. Manager"
## [87] " CRM"
## [88] " Customer Care Executive"
## [89] " Customer Service Engineer - - ICD Security Solutions"
## [90] " Customer Service Executive (Adeeba Group) for Tech Support/ Sales"
## [91] " Customer Support Executive"
## [92] " Data Science Engineer"
## [93] " Data Scientist - Sql/nosql"
## [94] " DEALER - RETAIL BROKING"
## [95] " Deputy Manager - Program Management"
## [96] " Design Engineer"
## [97] " Design Engineer Mechanical"
## [98] " Devops Engineer - Tools & Automation"
## [99] " DevOps Engineer Intern"
## [100] " Digital / Web Artist"
## [101] " Digital Content Producer For largest Media House"
## [102] " Digital Media Planner"
## [103] " Documentation Executive"
## [104] " Dot net Developer"
## [105] " Dot Net Developer"
## [106] " Draughtsman"
## [107] " DWH Tester - Manual Testing"
## [108] " Dynamic CRM Architect"
## [109] " Ecommerce Executive"
## [110] " Embedded Android Engineer"
## [111] " ETL Datastage Developer"
## [112] " Executive"
## [113] " Executive Assistant To Chairman"
## [114] " Executive Medical Coder"
## [115] " F&A Black belt - Process Excellence Lead"
## [116] " Female Fresher's Counsellor- Gurgaon"
## [117] " Field Sales Executive"
## [118] " Field Support Team-Supervisor"
## [119] " Finance & Accounting Associates"
## [120] " Finance & OPS - Technical Consultant (dynamics Ax/365) @ Bangalore"
## [121] " Finance Admin"
## [122] " Freelance Corporate Trainer on Taleo"
## [123] " Front End Developer - Wordpress/html/css/javascript"
## [124] " Front Office Executive-Noida"
## [125] " Full Time Academic Writer for Ca/cma- Accounting & Taxation"
## [126] " Global HR Operations Analyst"
## [127] " GM Finance- Export Import Company"
## [128] " Governance & Performance-Performance Management-Professors"
## [129] " Graphic Designer"
## [130] " Graphics Hardware Engineer"
## [131] " Great Opportunity To join top MNCs in Kolkata! Grab them While it last"
## [132] " Guest Relations Executive"
## [133] " Hardware Board Design Engineer"
## [134] " Have Confidence to Convince Customer Then Join Adeeba (Inbound Voice)"
## [135] " HCL Tech Hiring \"physical Design Engineers\" for VLSI R&D Division"
## [136] " Head- Land Management."
## [137] " Head - Project Management"
## [138] " Head - Sales & Strategy (telematics)"
## [139] " Head Engineering"
## [140] " Head of Maintenance"
## [141] " Head Sales- Coworking Company"
## [142] " Hiring .Net Developers for Hyderabad Location"
## [143] " Hiring a Valuation Associate (female Only)"
## [144] " Hiring for Accounts Manager (business Development)- Radio In"
## [145] " Hiring For Day Shift Non Voice Sal. Up To 24K"
## [146] " Hiring for Domestic/ International Processes.contact the HR Asap"
## [147] " Hiring for Manager Quality ( Voice and Chat)"
## [148] " Hiring For Oracle Apps DBA@ Hyderabad"
## [149] " Hiring For Record To Report"
## [150] " Hiring for Spring Boot Developer-noida"
## [151] " Hiring for Tech Pm/scrum Master for Hyderabad Location"
## [152] " Hiring for Tech Sales_Inbound UK/ US Voice Process"
## [153] " Hiring going on for .US Inbound Tech Support/ Sales"
## [154] " Hiring ll Azure Devops and Management Lead ll Hyderabad"
## [155] " Hiring: Executive-business Developer(seller Acquisition) On Contract"
## [156] " Home loan"
## [157] " HR - Talent scout specialist"
## [158] " HR Associate"
## [159] " HR PMO Professional"
## [160] " HR Recruiter"
## [161] " HR Recruitment Executive"
## [162] " HR Trainer"
## [163] " Hub-Incharge Bangalore"
## [164] " Huge Requirement for Customer Care Executive with Fixed Salary"
## [165] " If You're an Experienced in International Tech Sales Then Call Us / In"
## [166] " Immediate job Opportunity For Printer Engineer in Mumbai - Vashi"
## [167] " Immediate Opening Asp.net MVC Developers For Mumbai (worli)"
## [168] " Immediate Requirement for Fusion Technical Lead Developer"
## [169] " Immediate Requirement For Officer - IT @ Vibgyor High, Electronic City"
## [170] " Immidate Opening for Voice & Accent Trainer @ Vee Technologies"
## [171] " Inbound International BPO Voice Process-US Shift"
## [172] " Inbound Phone Banking Voice Process - Leading Bank - Noida"
## [173] " Inbound Technical Support With Attractive Salary Package"
## [174] " Inbound Tour Manager"
## [175] " Informatica Faculty Job Requirement in Hyderabad"
## [176] " Infrastructure management- Lecturer"
## [177] " Infrastructure SSO Architect- Looking For Early Joiners"
## [178] " Inside Sales Executive"
## [179] " International BPO- Mahindra- Meru- TATA SKY- Paddle Point-pepperfry-hc"
## [180] " International BPO / Non Voice Process / Rotational Shift / Ahmedabad"
## [181] " iOS Developer"
## [182] " iOS Game Developer"
## [183] " IP DRG / Surgery / ED / Denials Coders"
## [184] " IT - Head (preferably from an NGO)"
## [185] " IT Recruiter, Technical Recruiter"
## [186] " IT Security Head "
## [187] " J. Stores - Manager"
## [188] " Java- Technical Lead- Tavant Technologies - Hyderabad"
## [189] " Java / J2EE, Web Services also experienced in AngularJS"
## [190] " Java Developer"
## [191] " JAVA Developer"
## [192] " Java Developer - Spring/ Hibernate"
## [193] " Java Full Stack Developer"
## [194] " Java Software Engineer"
## [195] " Java with AngularJS and Spring"
## [196] " Java/j2ee Application Developer"
## [197] " Job Opening For Corporate Sales (insurance Broking) Mumbai/ Bangalore"
## [198] " Job Opening for Sm/avp_credit Audit_mumbai"
## [199] " Job Openings Kotak Life/ Max Life/ Aditya Birla Health for Sales Mgr"
## [200] " Jr. Support Executives"
## [201] " JUNIOR BIG DATA ANALYST IN"
## [202] " Junior Company Secretary"
## [203] " Key Accounts Manager"
## [204] " Laundry Executive"
## [205] " Layout Designer / Web Designer"
## [206] " Lead Business Systems Analyst"
## [207] " Linux Administrator Lead"
## [208] " Looking Facebook /social Media Manager For our Digital Marketing Ageny"
## [209] " Looking for a Job Change With a good package"
## [210] " Looking For Assistant Manager - Healthcare (US Visa is Must)"
## [211] " Looking For Trained Freshers in MS Dynamics CRM- Hyderabad"
## [212] " Machine Learning Engineer || Gurgaon/chandigarh Location"
## [213] " Magento Developer"
## [214] " Management Trainee"
## [215] " Manager- Admission"
## [216] " Manager- Compensation and Benefits"
## [217] " Manager (PR)"
## [218] " Manager (Service Operation)"
## [219] " Manager / Asst. Manager - Vendor Development ( Purchase ) - Gurgaon"
## [220] " Manager / Sr Manager - Digital Ad Sales - Ecommerce"
## [221] " Manager Accounts-wazirpur-mba-finance-salary-35k(export House exp)"
## [222] " Manager Brand Marketing"
## [223] " Manager Holidays"
## [224] " Manager Learning & Development"
## [225] " Manager Procurement"
## [226] " Manager Sales & Marketing"
## [227] " Manager Sales / Area Manager (tiles, Bath Fitting,paints)"
## [228] " Manager Sales Commercial Segment"
## [229] " Manager/senior Manager- Analytics- Life & Annuities - Insurance Domain"
## [230] " Marketing Executive"
## [231] " Marketing Manager - Activation - Iit/nit"
## [232] " MBA HR - Experience"
## [233] " Mechanical Engineer Require For Shut Down"
## [234] " Medical Coding Job(fresher Ug/pg) Pharm,lifescience,be(biotech&biomed)"
## [235] " Medical Scribe Chandigarh Mohali Noida No Fees, Salary-26k To 48k"
## [236] " Medical Transcriber"
## [237] " Merchandiser"
## [238] " Merchandising & Marketing- Professor"
## [239] " MES camster/apriso/hydra engineer"
## [240] " Microsoft Developer"
## [241] " MS SQL Developer : 0 - 2 Years (only MALE Candidates)"
## [242] " Netsuite Technical Consultant"
## [243] " Network & Security Architect- Pune"
## [244] " Night Shift - Non Voice / Web Chat - BPO"
## [245] " Nurses"
## [246] " nutanix sme "
## [247] " ODI Developer/lead ODI Developer - RACI"
## [248] " Office Assistant, Office Boy"
## [249] " Online Bidding Executive"
## [250] " Opening For Adobe Analytics Specialist"
## [251] " Opening For Articulate tool Developer - Articulate / Captivate)chennai"
## [252] " Opening For Dot Net Developer @ Baner, Pune"
## [253] " Opening for French Specialist Accounts Payable"
## [254] " Opening For Fresher"
## [255] " Opening For Sales and Marketing_nariman Point "
## [256] " Opening For the post of Mr/territory Business Manager in An Pharma"
## [257] " Openstack Engineer / Openstack Admin with Ceph Storage"
## [258] " Operation Executive"
## [259] " Operations - SME / Retail"
## [260] " Opportunity For Azure Devops Architect For Hyderabad Location"
## [261] " Opportunity For Current Account RM ||bank || Delhi"
## [262] " Oracle DBA Consultant - Data Guard/rac Modules"
## [263] " Oracle Fusion Apps_manufacturing_any Location"
## [264] " Oracle Sales Cloud Developer"
## [265] " Outbound Sales Executive"
## [266] " PERL Developer"
## [267] " Pharma/nutrition Sales Profile Opening with Hexagon Nutrition"
## [268] " php developer"
## [269] " PHP Developer"
## [270] " PHP Developer (wordpress & Woo Commerce/shopify / Magento)"
## [271] " PHP Developer Jobs In Gurgaon - Team Lead - PHP"
## [272] " Physics- TGT"
## [273] " Physics Teacher"
## [274] " Placement Officer,"
## [275] " PPC Executive"
## [276] " Pre Sales Executive"
## [277] " Presales Manager - Networking"
## [278] " Principal Consultant"
## [279] " Principal Engineer-Piping"
## [280] " Pro-Engineer , Matlab ,Ansys"
## [281] " Procurement - MDM"
## [282] " Product & Regional Sales Manager"
## [283] " Product Engineer"
## [284] " Product Manager"
## [285] " Product Manager- Marketing(consumer Durables)"
## [286] " Production Manager"
## [287] " Production Manager in Press Shop & Projection Welding"
## [288] " Project Executive/coordinator"
## [289] " Project Manager For Civil Work"
## [290] " Project Support Officer/Administrator"
## [291] " Public Relations Manager - Bangalore"
## [292] " Python Developer"
## [293] " Python Manager - IIT/ IIM/ DSE/ ISI"
## [294] " QA - Associate , - Business - Operations - DM"
## [295] " QA Executive"
## [296] " QA for Voice Process (LE-0097-N1C)"
## [297] " QA Functional Testing"
## [298] " Quality Assurance Engineer"
## [299] " React.js Developer"
## [300] " Receptionist (Female)"
## [301] " Reconciliation Executive"
## [302] " Recruitment Officer "
## [303] " Regional Representative"
## [304] " Regional Trainer - Skin for Wellness & Beauty Industry (only Females)"
## [305] " Relationship Manager"
## [306] " Relationship Manager - Bangalore"
## [307] " Requirement in Private bank for BDE"
## [308] " Restaurant Cashier"
## [309] " Sales- Fresher-for Leading Property Consultant"
## [310] " Sales / Business Development"
## [311] " Sales And Marketing/Business Development manager"
## [312] " Sales Coordinator"
## [313] " Sales Engineer"
## [314] " Sales Engineers"
## [315] " Sales Executive"
## [316] " Sales Head for It Consulting Company in Gurgaon"
## [317] " Sales Lead"
## [318] " Sales Manager"
## [319] " Sales Manager - Education Sales"
## [320] " Sales Manager : School & Higher Academic Books"
## [321] " Sales Manager Product and Portfolio"
## [322] " Sales Manger Opening In An E-commerce Industry- (mumbai, Pune)"
## [323] " salesfoce Developer +3Years / Mumbai"
## [324] " Salesforce System Architect"
## [325] " SAP PLM Consultant - SAP MM Module"
## [326] " SE / SSE - DATA"
## [327] " Senior .NET Developer"
## [328] " Senior .Net Developer For Leading IT Company in Gurgaon"
## [329] " Senior Accounts Executive"
## [330] " Senior BI Cognos Developer"
## [331] " Senior Branch Sales & Development Head - Agency - General Insurance"
## [332] " Senior Business Analyst - Sql/python"
## [333] " Senior Data Analyst"
## [334] " Senior Design Engineer - Manufacturing"
## [335] " Senior Drupal Developer"
## [336] " Senior Embedded Engineer"
## [337] " Senior Engineer Project"
## [338] " Senior Engineering Maintenance Manager For Knitting and ZLD System"
## [339] " Senior Executive- Contract Logistics- Bom WP-A"
## [340] " Senior Faculty - Information Design"
## [341] " Senior Game Artist"
## [342] " Senior Java Developer- Urgently Required by Mumbai IT Company"
## [343] " Senior Java Tech Lead - Spring Boot/ Data Structure"
## [344] " Senior Laravel Developer"
## [345] " Senior Manager-fundraising"
## [346] " Senior Manager Cost & Program Management"
## [347] " Senior Manager/associate Director - Mandarin"
## [348] " Senior Principal Software Engineer"
## [349] " Senior Resident - Obs. & Gynae, Max Hospital, Gurgaon"
## [350] " SENIOR SOFTWARE DEVELOPER (MVC .NET)"
## [351] " Senior Software Engineer - UI Development - Javascript/angularjs"
## [352] " Senior TSA Inbound Tech Process"
## [353] " Senior US IT Recruiter / Senior US Recruiter"
## [354] " SEO Executive"
## [355] " SEO Expert/ Digital Marketing Gurgaon"
## [356] " Service Engineer - Bhiwadi"
## [357] " Service Ops Expert - Servc Del | Microland"
## [358] " Sharepoint Support Engineer"
## [359] " SIEM Analyst"
## [360] " Smart Web Developer"
## [361] " SME Techincal Supervisor_ Red Hat, Fuse, Apache, Camel_magarpatta"
## [362] " Social Media Executive"
## [363] " Software Development / Software Engineer"
## [364] " Software Engineer- Mobile Applications - Android"
## [365] " Software Engineer - C++ Development - Ooad/oops"
## [366] " Software Engineer Android"
## [367] " Software Engineer Automation - Industrial Automation Job In Bangalore"
## [368] " Software Engineering- Mentor"
## [369] " Software Test Engineer -hyderabad"
## [370] " South Indian Cook,"
## [371] " Specialist - DV"
## [372] " Sr . Manager"
## [373] " Sr Equity Advisor - 5 nos"
## [374] " Sr Structural Engineer"
## [375] " Sr. Architect / Project Position: Sr. Architect / Project"
## [376] " Sr. Business Analyst"
## [377] " Sr. C# Developer"
## [378] " Sr. Cloud Developer"
## [379] " Sr. Engineer Design (Mechanical)"
## [380] " Sr. Manager- Art in Mumbai || Opportunity @ Client side"
## [381] " Sr. Manager- Business Development"
## [382] " Sr. Manager Sales Capability Building"
## [383] " Sr. Resident, General & Laparoscopic Surgery"
## [384] " Sr. Sales / Sales Executive"
## [385] " Sr. Sales Manager"
## [386] " Sr. Software Engineer"
## [387] " Sr. Software Engineer Android/Hybrid"
## [388] " Staff Nurse"
## [389] " Sterling OMS Architect"
## [390] " Store Head-leading Manufacturing Company"
## [391] " Strong Partner Ecosystem"
## [392] " Supply Chain - Import Export Executive"
## [393] " SUPPORT Engineers (FEMALE CANDIDATES)"
## [394] " Support Executive"
## [395] " Swimming Pool Technician"
## [396] " System Analyst"
## [397] " System Architect - 3g/4g Wireless Network Architecture & Migration"
## [398] " Tcs Hiring For Support Analyst - Bigdata(apache Hadoop,aws Certified)"
## [399] " Team Lead / Dev Lead"
## [400] " Team Leader- Head Digital Prtnrshp & BD"
## [401] " Tech caller hiring a huge number of Executives."
## [402] " Technical / Functional Skills"
## [403] " Technical Lead"
## [404] " Technical Lead -(VoIP,Cisco Call Manager)"
## [405] " Technical Sales Executive -mumbai"
## [406] " Technical Sales Executive with fixed pay & lucrative incentives/UK Inb"
## [407] " Technical Support"
## [408] " Technical Support Associate / Technical Sales Associate-Inbound Voice "
## [409] " Technical Support Engineer"
## [410] " Technical Support Executive"
## [411] " Technical Support/ Product Support"
## [412] " Technical Writer"
## [413] " Technician, Technical Support"
## [414] " Telle Caller"
## [415] " Territory Sales Manager-Passive Networking-Mumbai/Bangalore/Hyderabad"
## [416] " Test Principal Engineer"
## [417] " Tooling & Sampling"
## [418] " Trainee Research/ Research Executive- Hi- Tech Operations"
## [419] " Training Specialist"
## [420] " UI Developer"
## [421] " UI Developer (Frontend Developer)"
## [422] " Urgent Hiring for Area Sales Manager"
## [423] " Urgent job Position For SAP MDG Functional Analyst- All Over India"
## [424] " Urgent Opening - Hp-ux Administrator"
## [425] " Urgent Opening for \"US Staffing Professionals\" - Noida"
## [426] " Urgent Opening For Asst. Manager-it Infrastructure - Mumbai"
## [427] " Urgent Opening For Field Recruiter "
## [428] " Urgent Openings For Pharma Freshers"
## [429] " Urgent Requirement for CCE Telesales for Night Shift."
## [430] " Urgent Requirment For Central Processing Center- Mumbai"
## [431] " Urgently Required Senior PHP Developer(laravel) || Gurgaon "
## [432] " US Based Financial Company Looking For Java API Engineers For HYD"
## [433] " US Tech Process"
## [434] " Vacancy For Motion Graphic Artist"
## [435] " Vancancy for Inbound Tech Sales Executive"
## [436] " VERY Urgent Opening for IT Recruiter & Non IT Recruiter !! Apply NOW "
## [437] " Visual Designer"
## [438] " VP / Sr.vp Fire"
## [439] " Walk- in | Hdfc Life | We are Hiring Freshers:5th till 20th Aug@ Delhi"
## [440] " Walk- In For Development QA/ Regulatory Affairs"
## [441] " Walk-in Drive for Java Dev/sr. Dev on 29th June at Delhi"
## [442] " Walk-in Interviews For Sr.executive - Procurement on 5th July"
## [443] " Walk in For Pharmacist @ 1mg Technologies || Gurugram Sec 14"
## [444] " Wanted Engineering Fresher For MNC Chennai"
## [445] " Web Designer"
## [446] " Web Designer - Html, CSS, Bootstrap, Photoshop"
## [447] " Web/ GUI Designer"
## [448] " Website Designer"
## [449] " When you need a Roof you need a job. Come work with us"
## [450] " Wire Industry"
## [451] " Wordpress Web Developer"
## [452] " Workflow Coordinator"
## [453] "Assistant Manager – BI&I (data Automation)"
## [454] "Data Science Manager"
## [455] "Deputy Manager- Performance/digital Marketing"
## [456] "Enterprise Business Development Representative"
## [457] "Excellent Opportunity For ” Linux Device Driver ” ,for Hyderabad and Ban"
## [458] "Executive - Lab Instruments Maintenance"
## [459] "HR Recruiter (volume Hiring)"
## [460] "Java Enterprise Edition"
## [461] "Java Full Stack – Technical Lead, Senior Engineer"
## [462] "Mechanical Maintenance – Btech / Diploma"
## [463] "Nokia WING Circuit Core - SMSC Engineer"
## [464] "Nosql (couchdb/redis/bigtable/dynamodb)"
## [465] "Oracle IDAM"
## [466] "Software Engineer - Unity Developer"
## [467] "Solution Architecting"
## [468] "Spring Boot"
## [469] "Sr.consultant-power Distribution"
## [470] "System Monitoring Tools & Techniques Professional"
## [471] "Urgent Opening Automation Test Engineer 2-5yrs-bellandur Bangalore"
## [472] "Urgent Openings for O2C"
## [1] "----- Job.Experience.Required , num categorias: 76 -----"
## [1] " 0 - 2 Years" " 1 - 3 Years" " 13 - 15 Years" " 2 - 4 Years"
## [5] " 2 - 5 Years" " 2 - 7 Years" " 3 - 7 Years" " 3 - 8 Years"
## [9] " 4 - 6 Years" " 4 - 7 Years" " 4 - 9 Years" " 5 - 10 Years"
## [13] " 5 - 7 Years" " 6 - 11 Years" " 8 - 12 Years" "0 - 0 yrs"
## [17] "0 - 1 yrs" "0 - 2 yrs" "0 - 3 yrs" "0 - 4 yrs"
## [21] "0 - 5 yrs" "1 - 2 yrs" "1 - 3 yrs" "1 - 4 yrs"
## [25] "1 - 5 yrs" "1 - 6 yrs" "10 - 12 yrs" "10 - 14 yrs"
## [29] "10 - 15 yrs" "10 - 16 yrs" "10 - 17 yrs" "10 - 20 yrs"
## [33] "11 - 15 yrs" "12 - 15 yrs" "12 - 16 yrs" "12 - 17 yrs"
## [37] "12 - 18 yrs" "12 - 22 yrs" "15 - 18 yrs" "15 - 20 yrs"
## [41] "15 - 22 yrs" "17 - 27 yrs" "2 - 3 yrs" "2 - 4 yrs"
## [45] "2 - 5 yrs" "2 - 6 yrs" "2 - 7 yrs" "20 - 26 yrs"
## [49] "3 - 4 yrs" "3 - 5 yrs" "3 - 6 yrs" "3 - 7 yrs"
## [53] "3 - 8 yrs" "4 - 5 yrs" "4 - 6 yrs" "4 - 7 yrs"
## [57] "4 - 8 yrs" "4 - 9 yrs" "5 - 10 yrs" "5 - 7 yrs"
## [61] "5 - 8 yrs" "5 - 9 yrs" "6 - 10 yrs" "6 - 11 yrs"
## [65] "6 - 7 yrs" "6 - 8 yrs" "6 - 9 yrs" "7 - 10 yrs"
## [69] "7 - 12 yrs" "7 - 8 yrs" "8 - 10 yrs" "8 - 12 yrs"
## [73] "8 - 13 yrs" "9 - 14 yrs" "Not Mentioned" "vide"
## [1] "----- Key.Skills , num categorias: 473 -----"
## [1] " 4G| 3GPP| 3G| System Architect| LTE| Radio Access Network| PhD| IEEE"
## [2] " academic research| accounting| taxation| ifrs| us gaap| international taxation| cost accounting| company secretary| auditing| company law| corporate law| icwa| cma"
## [3] " accent| auditing| soft skills| training needs| customer service| process compliance"
## [4] " access controls| Technology| Asset Management| Intellectual Property| Vendor Management| CRM"
## [5] " Accounting Entries| Debit| Communication Skills| Finance| Document Verification| Banking| Problem Solving| Open Office| Dispute Management"
## [6] " Accounting| Continuous Improvement| Process Improvement| Load Balancing| Lean Six Sigma| Black Belt| Training| Green Belt| Process re - engineering| Process Excellence| Business Excellence| OTC"
## [7] " accounting| finance| financial reporting| statutory compliance| gst| vat"
## [8] " accounts executive| accountant| Stock Management| gst| auditing| Statutory Compliance| accounting| Account Assistant| Bank Reconciliation| tax audit| banking| monthly reports| Payroll| salary processing| income tax| Income Tax Return| taxation"
## [9] " accounts executive| Accounting| accounts| finance"
## [10] " accounts payable| accounting| AP"
## [11] " Administration| Administrative Support| Contract Logistics| Staff Development| Site Management| Quality Improvement| warehousing| Warehouse Operations"
## [12] " Administration| HR| Recruitment| Recruitment Executive| IR"
## [13] " adobe experience manager| digital| digital marketing| adobe analytics| data analytics| aem| adobe| sitecatalyst"
## [14] " ajax| javascript| php| erp| website| development| software development| module| mca| application development| application| web| programming"
## [15] " Analyst"
## [16] " Analyst| ERP| Change management| Business objects| Managed services| Business process mapping| Executive management| Data mining| oracle project accounting| Testing"
## [17] " Analytical skills| Technical| Educational qualification| Stores| Management| Forecasting| Electricals| Inventory| Cables| Organization skills"
## [18] " analytical| documentation| web development| algorithms| development| javascript| sql server| jquery| database| web| flex| design| mysql| net"
## [19] " Android Development| Android Studio| Java| Troubleshooting| API Testing| API"
## [20] " android| btech| iphone| server| analytical| developing| ios| platforms| objective c| web| xml| design| json| programming| development| c| testing| mobile| xcode| application development| eclipse| application| sdk| applications"
## [21] " Android| Troubleshooting| Middleware| Firmware| SOC| Linux kernel| Bluetooth| Computer science| Test scripts| Test strategy"
## [22] " Angularjs| CSS| Core Java| DOM| Computer Science| Javascript| HTML| Spring| Ajax"
## [23] " Angularjs| CSS| Responsive Web Design| Javascript| Bootstrap| HTML| JSON| JQuery| Web Development| Grunt"
## [24] " Ansys| thermal| MATLAB| System design| Recruitment| MCCB| Electricals"
## [25] " apache camel| Administration| Technical Support| redhat| Activemq"
## [26] " Architect| Engineering Design| EPC| Civil"
## [27] " Area Sales Management| Retail Sales| FMCG| Chocolate| confectionary| ASM| Area Sales Manager| area business manager"
## [28] " Art Director"
## [29] " Articulate Storyline"
## [30] " asp dot net| .net developer| Dot Net Developer| asp.net| asp . net"
## [31] " Asp.Net MVC| entity framework| API"
## [32] " asp.net| ado.net| MVC"
## [33] " assembly language| Six Sigma| PMP| C| JavaScript| .NET| HTML| Oracle| Python| SQL"
## [34] " Assistant Manager Purchase"
## [35] " assistant restaurant manager| restaurant| restaurant manager"
## [36] " Associate"
## [37] " Audit| Credit Officers| Internal audit| Accounting| Finance| Tax| Accounts| Risk Management"
## [38] " Auditing| Audit Planning| Risk Assessment| Banking| Credit Risk| Credit Policy"
## [39] " AutoCAD| 3D Modeling| FMEA| Mechanical Engineering| Mechanical Design| SolidWorks"
## [40] " AutoCAD| Costing| Draughtsman| Civil| 3D"
## [41] " Automation Engineer"
## [42] " Automobile| Digital Content| Content Development| Production| Web Content Writing"
## [43] " Automobile| Warehouse| Problem management| Manager Operations"
## [44] " b2b sales| team management| kam| commercial vehicle| sales strategy| enterprises sales"
## [45] " back office processing| BPO| part time| data entry| computer operator| backend| non voice| chat process| account| marketing| inbound process"
## [46] " Balance Sheet Finalisation| service tax| bank reconciliation| gst| income tax| taxation| financial auditing| finance| tax audit"
## [47] " bca| cold calling| bidding| academic| customer service| documentation| selling| web development| seo| mba"
## [48] " bca| graphics| application development| b tech| core| b sc| application| b e| ios| publishing| animation"
## [49] " Bde"
## [50] " biotechnology| microbiology| nursing| biomedical| medical coding| medical coder| pharmacy| life sciences"
## [51] " Bpo Voice| Voice Process| International BPO"
## [52] " BPO| any graduate| Voice Process| Voice Support"
## [53] " BPO| Customer Support| international bpo| Voice Process| International Voice| International Voice Process"
## [54] " BPO| Outbound| English| Email| Inbound calls| Customer service| Troubleshooting| Technical support| Recruitment| Comp"
## [55] " BPO| Transactional Quality| Quality Management| Quality manager| manager Quality"
## [56] " build automation| Entity framework| MVC| microsoft| SQL"
## [57] " Business communication| Analytical skills| Business objects| Team management| management| Transition management| Trend analysis| Variance analysis| Analytics"
## [58] " Business Development Management| Bd| Marketing| business development| Projects| business development manager| bdm| Tendering| Proposal"
## [59] " business development management| Sales Management"
## [60] " business development| e - commerce| sales executive| sales associate| sales officer| sales| field sales| mba fresher| fresher| new product development| channel sales"
## [61] " Business Development| Sales| Bde| New Business| Business Analyst| Business Development Manager| Business Development Executive| Senior Business Analyst| Sales Manager| Banker| Private Banker| Sales Officer"
## [62] " business development| sales| sales marketing| marketing executive| sales executive| sales officer| sales manager| area sales manager| territory sales manager| territory manager| area manager| regional manager| regional sales manager| regional business manager"
## [63] " Business solutions| Project delivery| Conceptualization| Green field projects| Gap analysis| PDF| Regulatory compliance| account mining| Delivery Lead| Oracle Retail"
## [64] " C#| .Net| Asp.net"
## [65] " C#| Azure| Powershell| Script Writing| API| Debugging| Devops| Application Integration"
## [66] " C#| CSS| XML| Asp Net| Javascript| Web Application| MS SQL Server| .Net| MVC| ASP.Net MVC| JQuery| Ajax"
## [67] " C#| Java| OOP| C++| Multithreading| UML| OOAD| OOPS| .Net| debugging"
## [68] " C#| MS Dynamics CRM| Microsoft Dynamics| ms dynamics"
## [69] " C| Python| Six Sigma| PMP| .NET| HTML| JavaScript| SQL| Oracle| assembly language| Real Time Operating Systems"
## [70] " C| Woocommerce| Magento| Wordpress| MySQL| PHP| Shopify| JQuery| Web Development| Ajax"
## [71] " c++| development| gaming| C| software| HTML| ios| opengl| iphone| design| MySQL| JavaScript"
## [72] " Cash Handling| Cashier Activities| Day Book| Cashier| Restaurant| CSAT"
## [73] " CATIA| AutoCAD| Pressure vessels| Mechanical| Primavera| PSCAD"
## [74] " cca| bpo| csr| international bpo| customer service| outbound process| customer care| tourism| customer support| fresher| voice process| inbound process| cse| bpo fresher| voice support| hotel| travel"
## [75] " Change management| Excel| Customer satisfaction| Project management| Relationship building| HR policies| HR| Scheduling| Visio| Stakeholder management"
## [76] " Change management| Healthcare| Analyst| Business Analyst| Social media| Problem management| Software development life cycle| Scheduling| OEE"
## [77] " channel partners| real estate| negotiation| property| Residential Sales"
## [78] " Chief Engineer| Hospitality| HVAC| Maintenance| Water Treatment| Energy Conservation| Capital Expenditure"
## [79] " clinical pharmacy| mr| sales officer| territory executive| business development| sales executive"
## [80] " cloud| puppet| python| git| KVM| linux| jenkins| openstack| ansible"
## [81] " cms| javascript| wordpress| drupal| joomla| ajax| cakephp| zend| knowledge| xhtml"
## [82] " cnc| cnc operator| cnc maintenance| cnc programming"
## [83] " co ordination| team management| drafting| loans| online| coordination| quality"
## [84] " Com| Application support| Email| SAP IS-Utilities| level| Billing| change| Service| CRM| Entry level"
## [85] " Commercial Activities| Commercial Sales| Online Sales| Senior Management| Budgeting| Strategy Implementation| Marketing| E - commerce"
## [86] " Communication Skills| Detail Engineering| Material Handling| AutoCAD| Detailing| Design Engineering| Microstation| Bid Evaluation"
## [87] " Computer Operator| MS Office| Software services| Comm| Typing speed| WHO| Software| level"
## [88] " Computer science| Continuous improvement"
## [89] " Computer science| Fabrication| Quality check| Intellectual property| Electronics| Support services| Research| Management| Human resource management| Research Executive"
## [90] " Conceptualization| Architecting| Continuous improvement| SIDE| development| Front end| it"
## [91] " contract management| closing| it services| relationship building| managed services| selling| market research| business development manager| sales"
## [92] " Copyright| Customer Service Representative| CV| Customer service| Security| Troubleshooting| CCTV"
## [93] " Copyright| Email| jQuery| XML| Javascript| CakePHP| Customer service| Open source| Facebook| CSS3"
## [94] " Corporate Training| corporate trainer| technical trainer"
## [95] " counselling| couselling| fresher| student counsellor| student counseling"
## [96] " Counselor| Mentor| Trainer| Advisor| Teaching"
## [97] " Credit Officers| Risk Management| Administration| Report Generation| Analysts| analytical skills"
## [98] " CSS| Html5| MySQL| Javascript| Bootstrap| JSON| Node.Js| JQuery| Core PHP| Ajax"
## [99] " CSS| jQuery| MySQL| Javascript| HTML| Web Development| Laravel| Codeigniter"
## [100] " CSS| Singleton| XML| Javascript| JDBC| Struts| JSON| HTML| Spring Boot| JQuery"
## [101] " CSS| Wordpress| MySQL| Javascript| PHP| HTML| JQuery| SEO| Ajax| Hosting"
## [102] " Customer Care| Inbound Process| Night Shift| Customer Care Executive| Customer Care Officer| BPO| Domestic BPO| International BPO"
## [103] " customer profiling| market research| sales executive| marketing executive| distributors| sales strategy| Business Development"
## [104] " Customer profitability| Receivable management| Education| Relationship building| Transportation| Service| Monitoring| Key accounts"
## [105] " Customer relationship| Automobile| Proposal preparation| CRM strategy| Architecture| Database| Testing"
## [106] " customer segmentation| Brand management| Strategic partnerships| Brand marketing| Consumer insights| Performance appraisal| Operations| Promotional strategies| Marketing strategy| Recruitment"
## [107] " customer service| customer care| team| communication| bpo| call center| inbound| voice| backend| non voice| telecalling| cse| cro| cce| data entry| back office| voice process| domestic bpo| fresher| trainee| Telemarketing| Outbound| sales| hardware| networking"
## [108] " Customer service| Healthcare| Customer relationship| Windows| Graphic designing| CAD| Illustrator| Customer satisfaction| Application software"
## [109] " Customer Support Executive| Customer service| Business Executive| process"
## [110] " customer support| support service| field support| team| management| supervisor| self motivated| continuous improvement| give| enthusiastic"
## [111] " CVS| ERP| Rest| middle east| Technical| Customization| E-commerce| CRM| Open| WHO"
## [112] " data analysis| Admissions| placements| Help Desk| access controls| Asset Management"
## [113] " Data analysis| Automation| Google Analytics| Excel| Analytical| Business intelligence| Analytics| Product marketing| SQL| Data extraction"
## [114] " Data analysis| Consumer research| Management| Head Business Development"
## [115] " data analysis| vba| macros| advanced excel| oracle sql| google analytics| business analysis| python| data mining| business analyst"
## [116] " Debugging| Troubleshooting| Python| Interpersonal skills| OOPS| Programming| developer"
## [117] " design| android| erp| software| mvc| quality"
## [118] " digital marketing| international sales| international marketing| international business development| business development| Export Marketing"
## [119] " digital marketing| seo specialist| advertising agency| online marketing| seo| seo expert| facebook marketing"
## [120] " digital marketing| seo| social media marketing| content marketing| email marketing| sem| google analytics| campaign management| facebook| media management"
## [121] " Digital media| PHP| Recruitment| Bengali| LMS| Business administration| Content Editor| Journalism| Literature| Administration"
## [122] " Direct sales| Cold calling| English| Networking| Business Development Manager| Customer interfacing| Data collection| Service| Digital marketing| WHO"
## [123] " dot matrix| printer| printer support| Laserjet| Hardware"
## [124] " Drupal| Application programming| MySQL| Wordpress| PHP| CakePHP| Team Leader| MVC| Zend| Software services"
## [125] " Drupal| Linux| MySQL| Python| Consulting| Procurement| Monitoring| Front end| Backend| Django"
## [126] " Dynamics CRM| .Net| Azure| Visual Studio| Microsoft Dynamics| Solution Management| Root Cause| microservices| .NET development"
## [127] " e - tendering| Tender Preparation| bid preparation| proposal preparation"
## [128] " Editing| proof reading| content writer| editor| Articles| Article Writing| Content Editor| Journalism| Mass Communication| Copywriter| Associate Editor| Sub Editor| English Writing| Research| Social Media"
## [129] " electronic trading| structured finance| dcf| equity research| bloomberg| investment banking| business analysis| bonds| valuation| advanced excel| hedge fund| financial modelling| structured products| fixed income"
## [130] " English| MS Office| admin executive| Billing| Stock inventory| Writing| Office management| Management| Business Executive| Application"
## [131] " English| PHP| XML| DOM| SOAP| Com| Web technologies| Written communication| Email| Time"
## [132] " enterprise sales| relationship building| new business| sales strategy| B2B Sales| marketing management| cross selling| product marketing| consultative sales| b2b marketing| service sales| Corporate Sales| Key Accounts Manager"
## [133] " environment| functional| operations| business| verbal communication| coaching| analytical skills"
## [134] " Equipment Maintenance| Hydraulics| Inventory Management| Management Skills| Maintenance Head| Electricals"
## [135] " Equity| Currency| Mutual Funds| Commodities| Stock Broking| New Client Acquisition| Business Generation| Channel Distribution| Team Management| team handling| sales"
## [136] " ERP| MIS| Succession Planning| Reports| Talent Management| Human Resources| HR Policies| Recruitment| Talent Acquisition"
## [137] " ERP| RF| Action plan| Relationship| Software sales| Business planning| B2B Sales| RFQ| RFP| CRM"
## [138] " ERP| Succession Planning| MIS| Reports| Talent Management| Human Resources| HR Policies| Recruitment| Talent Acquisition"
## [139] " Escalation management| Field Sales Executive| Sales achievement| Training| Insurance sales"
## [140] " Ethical Hacking| Certified Ethical Hacker| Networking Protocols| Penetration Testing| Nessus| NMAP| Fortify| Vulnerability Assessment| Appscan| Qualys"
## [141] " Exadata| performance tuning| 11g| patching| sql| dataguard| rac| cassandra| oracle database| Weblogic| ebs| asm| apps dba| cloning"
## [142] " Excel| Sales| Conflict resolution| Analytical| Management Trainee| Power point presentation| MS Office"
## [143] " Facility Management| facility services"
## [144] " filing| tds| service industry| pf| esi| returns| coaching| payroll| invoice| tally"
## [145] " financial analysis| financial planning| taxation| VP Finance"
## [146] " Financial reporting| Due diligence| Data analysis| Accounting| International finance| Banking"
## [147] " financial s| windows| android| mobile development"
## [148] " Fire Safety| fire| Senior Management"
## [149] " fixed assets| accounts payable| record to report| general accounting| general ledger"
## [150] " Forecasting"
## [151] " Fortigate| Networking| Routing| Hyper - V| Dlp| Sophos| Windows| Virtualization| Switching| Firewall"
## [152] " fresher| icse| inbound process| outbound| international bpo| uk process| bcom| communication skills| back office| cbse| web chat| chat process| Aviation| Guest Relations| Public Speaking| PR"
## [153] " Front end| Email| PDF| MIN| UI| phone| Strategic HR| Doc| Consultancy| Recruitment"
## [154] " Front Office Executive"
## [155] " fundraising| finance"
## [156] " GIS| ISO 27001| HR| information system| process| ISO 9001| Information security management| GIS software| Management| Edge"
## [157] " GIT| Linux| Machine Learning| Python"
## [158] " GNM| Business Executive"
## [159] " good communication skill| good speeking manners| ability to face strangers| punctual| gopod efficiency"
## [160] " Graphic designing| Graphics| adobe creative suite| Architecture| MS Office| Business Executive"
## [161] " Graphics| C++| Windows OS| Linux| high performance computing| Test cases| System software| Gaming| FreeBSD"
## [162] " Graphics| Multimedia| Visualization| Infographics| Social Media| Adobe After Effects| Protools| Photoshop| Graphic Designing| English Language"
## [163] " Graphics| Simulation| Power management| Electronics| Hardware| Research| System analysis| Electricals"
## [164] " gsm| ethernet| development| optimization| product development| troubleshooting| gps| lcd| embedded| spi"
## [165] " Hardware Board Design| Mixed Signal| Design Engineering"
## [166] " head hunting| talent acquisition| Recruitment Executive| it recruitment| screening| technical recruitment| hiring| recruitment consultant| recruitment| sourcing| excel powerpoint| staffing"
## [167] " Help Desk| Customer Service| customer relationship| access controls| Asset Management| Vendor Management"
## [168] " Hibernate| Design Patterns| Cloud| Spring Boot| Team Leader| core java| Web Services| Microservices"
## [169] " hiring| HRIS| procurement| HR| sourcing| Recruitment| staffing"
## [170] " hive| apache| itil process| hadoop| big data| aws| core java"
## [171] " hospital| pharma| pharmacy"
## [172] " HR| Human Resource Management| Placement Coordination| recruitment executive| recruitment officer"
## [173] " hr| recruitment| recruiter| hiring| head hunting| leadership| mass hiring| volume hiring| bulk hiring| team leader| senior| tl| non it| it recruitment| technical hiring| it recruiter| bfsi| engineering| manufacturing| insurance| bpo| IT"
## [174] " HTML| XML| Ajax| rest| Prototype| technical| developing| JSON| application architecture| SDLC| javascript| jQuery| Web services| java| application| web| design| Web designing| architecture| applications"
## [175] " HTML5| ASP"
## [176] " HVAC| Architecture| Project management| CAD| thermal| Conceptualization| Instrumentation| Autodesk| Food processing| Project delivery"
## [177] " IIS| Exchange Server| Windows Server| WSS| Sharepoint| Active Directory"
## [178] " Illustrator| Corel Draw| Photoshop"
## [179] " Illustrator| Web designing| Photoshop| CSS| Web technologies| XML| Intranet| Business Executive"
## [180] " inbound| costing| selling| good communication| good communication skills| tickets| tour| experience| manager| packages"
## [181] " Informatica Power Center| Informatica"
## [182] " Innovative| Aggressive"
## [183] " Inside Sales| Lead Generation| Cold Calling| New Business| Customer Service| Proposal Writing| Follow Ups| Sales Executive Activities| Communication Skills| Convincing Power"
## [184] " institutions| relationships| marketing executive| customer| customers| implementation| company| site| product"
## [185] " instrumentation engineering| electrical engineering| Engineering| fresher| Trainee| immediate| Mechanical Engineering| electronics engineering| undergraduate"
## [186] " Intern| Linux| Windows| Unix| DNS| C++| Perl| IIS| Redhat| HTTP"
## [187] " international bpo| bpo| kpo| web chat| non voice process| e mail| international call center| customer service representative| cse| interpersonal skills| ites| uk shift| customer service| e - commerce| customer care| customer support| bpo fresher"
## [188] " international bpo| Chat Process| voice based process| tele caller| process developer| Sales| b.a| exl| communication skills| Ba| Blended Process| bba| wipro| tcs| bbm| customer support| bcom| cse| accenture| Fresher| wns"
## [189] " international bpo| IT Helpdesk| freshers| customer care| international voice| call center| customer support| technical helpdesk| service desk| bpo fresher| uk| us| communication skills"
## [190] " International Call Center| Technical Support| Maintenance| Communication Skills| PC Hardware| Technician Activities| Social Media| Analytical Ability| Soft Skills| Customer Satisfaction"
## [191] " Internship| Digital marketing| Social media| Relationship building| Animation| Creative| Indesign| Business Executive| Presentation skills| Senior"
## [192] " Interpersonal skills| Direct marketing| IT hardware| Management| Support Executive"
## [193] " IT Sales| Marketing Campaigns| Social Media| Btl| Marketing Management| Digital Marketing| Dealer Sales| Channel Partners| Communication Skills| Process Flow"
## [194] " J2Ee| Core Java| jQuery| ERP| Tomcat| Eclipse| Open source| Selenium| Computer science| OFBIZ"
## [195] " Java EE| Hibernate| Core Java| Software Development| Spring Mvc| Multithreading| OOD| JDBC| Spring Boot| JSF"
## [196] " Java EE| JMS| Core Java| JUnit| Weblogic| HTML| JPA| JSON| SOAP| SQL"
## [197] " java| cisco call manager| visa| j2ee| sip| offshore| communication skills"
## [198] " Java| core java| J2EE| Hibernate| Spring| LDAP| ADFS| Json| SOAP| jQuery| REST| Javascript| Java Web Services| Java Api| Advanced Java| MVC| Web Services| Open Source| SOA| Cloud| spring integration"
## [199] " Java| CSS| Rest| Spring Mvc| Javascript| HTML| JPA| Spring Boot| JQuery| Web Services"
## [200] " Java| java api| Banking| j2ee| API| finance| core java| microservices"
## [201] " JAVA| Java| Business Analysts| development| Architects| HTML| Lead Developers| SQL| XML| design| PHP| ios development| PL"
## [202] " Java| JPA| Hibernate| Project Management| JDBC| Scrum Master| Microservices| Agile| SOAP| Rest"
## [203] " java| linux| server| development| eclipse ide| c| technical| mobile| eclipse| objective c| usability| ui| design| debugging| backend| developer| programming| applications"
## [204] " java| mongodb| Hibernate| spring| jms"
## [205] " Java| SOA| TDD| SaaS| J2EE| Spring Boot| API| Algorithm| Data Structure"
## [206] " Java| Spring Boot| Web Services| Microservices"
## [207] " Java| Tomcat| Eclipse| OOPS| HTML| UNIX| SQL| DB2| Weblogic| XML| Flex| Oracle| PL"
## [208] " Java| Webservices| Spring| Hibernate| System Design| ESB| SQL| Spring Boot| Javascript"
## [209] " javascript| html| ajax| jquery| php mysql| smarty| api| analytical| third party| software development life cycle"
## [210] " javascript| html| sql server| ajax| jquery| soa| oop| english| proactive| asp net c"
## [211] " Javascript| PHP| HTML| Visualization| jQuery| web| Programming| Commerce| Web designing| Application| Android"
## [212] " javascript| sql| php| php mysql| css| software development| technical| photoshop| mca| ajax| jquery| application| web| design| mysql| html"
## [213] " Javascript| SQL| Python| design studio| Strategy consulting| Front end| big data analytics| QlikView| MATLAB"
## [214] " Javascript| SQL| XML| server| css| technical| software| developing| HTML| tracking| database| web| Application development| net| programming| Ajax| development| DOM| solid| data integrity| Stored procedures| Reporting tools| application| applications"
## [215] " JMS| Core Java| Sonar| Weblogic| XML| J2Ee| SVN| Spring| Oracle 11G| SQL"
## [216] " jQuery| Analytical| Wordpress| Conceptualization| Web designing| Photoshop| Business Executive| CSS3| Ideas"
## [217] " jquery| git| microsoft sql server| net asp net| software| testing| ado.net| microsoft| tools| sql| unit tests| database| application| web| design| .net| object oriented programming| support| programming"
## [218] " jQuery| MySQL| Struts| Javascript| Database| JSF"
## [219] " land acquisition"
## [220] " laundry"
## [221] " Layout design| Corel Draw| Web designing| Photoshop"
## [222] " layout| coordinating| material selection| ms| mep| photoshop| corel draw| co| monitoring| plumbing"
## [223] " layout| visualization| digital media| graphic design| html| illustration| tools| part time"
## [224] " lead generation| branding| business development| Sales Management| market research| competitive intelligence| market analysis| Marketing"
## [225] " lead generation| business development| corporate sales"
## [226] " Leadership training| Software development life cycle| Management"
## [227] " Linux| Agile| Python| Computer science| Coding| Fixed income| Machine learning| Asset management| JIRA| Financial services"
## [228] " Loans| Direct Sales Associate| Policies| Bfsi| Finance| Sanction| WHO"
## [229] " Management accounting| Accounting| VAT| Book Keeping| SAGE| Tax returns"
## [230] " Manager Sales| Sales Manager| assistant sales manager| MICE| Travel Agent| Senior Sales Executive| senior sales officer| Corporate Sales| Hotel Sales| Room Sales| Sales Executive"
## [231] " Manual testing| Eclipse| Coding| Scrum| Enterprise applications| Healthcare| JIRA| Android SDK| test driven development| Business Analyst"
## [232] " Manual testing| Informatica| microsoft| Process automation| System testing| PDF| Artificial Intelligence| Regression testing| Silicon| Analytics"
## [233] " manual testing| test engineering| test cases| web testing| web technologies"
## [234] " Market analysis| Public relations| CV| Relationship building| Market intelligence| Prospecting| Budgeting| Sales process| Branding"
## [235] " market| presentation| strong analytical skills| english| presentation skills| developing| customer interaction"
## [236] " marketing executive| distributors| customer profiling| sales strategy| market research| Business Development| sales executive"
## [237] " marketing executive| Sales| distributors| customer profiling| sales strategy| market research| Business Development| sales executive"
## [238] " marketing officer| pharma sales| Marketing Representative| marketing executive| pharma marketing| sales officer| sales representative| business development executive| Fresher| trainee| sales executive"
## [239] " Marketing Strategy| Strategic Thinking| Interpersonal Communication| Sales| Promotions| Accounting| Account Management| Team Leading| Business Development Management| Advertising"
## [240] " marketing| bdm| sales| business development| it sales| ncr| hardware sales"
## [241] " Marketing| Event Management| Brand Management"
## [242] " marketing| project management| PR| project planning"
## [243] " Mba Finance| Auditing| Internal Audit| SOX| Audit Compliance| Compliance"
## [244] " MBBS| B.sc| Biotech| Dermatology| Rheumatology| ENT| BDS| Medicine| Pathology| Immunology| Medical Transcription| Radiology| Genetics| BAMS| MDS"
## [245] " MCSE| Database| Support Engineer"
## [246] " Media Planning| Digital Media"
## [247] " Medical Representative| Senior Executive"
## [248] " Mentor| Android| Consulting| Usage| development| software| mobile| it| SIDE| Front end| Web technologies| Coding| web| backend| Open source| programming| Investment"
## [249] " Merchandising| Buyer Activities| Follow Ups| Vendor| purchase| vendor development| tracking"
## [250] " microsoft dynamics ax| strategy implementation| proposal development| business development| resource planning| cost management| enterprise applications| data integrity| microsoft applications| process design| technical consultant"
## [251] " Microstrategy| Business Intelligence| Cognos| Business Objects| Tableau| AWS| Python| SQL"
## [252] " MIS reporting| Trade| Operational risk| Banking| Relationship| Client relationship| Saving"
## [253] " molecular biology| chemistry| biotechnology| bhms| biology| Physiotherapy| microbiology| nursing| biomedical| Physics| medical coding| biochemistry| pharmacy| Ophthalmology| micro biology| Bioinformatics| zoology| biotech"
## [254] " Monitoring| Senior Resident| RAM| DNB| Dmc"
## [255] " Monthly Reports| Maintenance| Technician Activities| Water Quality"
## [256] " Motion Graphics| Infographics| Illustrator| animations| infographics| Corel draw| Photoshop| CorelDRAW| Visual Designer"
## [257] " motor insurance| insurance sales| insurance broking| general insurance"
## [258] " MS Office| Data entry"
## [259] " MySQL| Javascript| UML| server| css| Technical writing| html5| bootstrap| microsoft| Technical support| sql| cloud| ui| web| design| asp.net| mvc| api| architecture| level| Visual Studio| quality| MS SQL| infrastructure| .net| agile| angularjs| aws"
## [260] " MySQL| Wordpress| Javascript| Flex| CMS| PHP| HTML| JSON| Joomla| Ajax"
## [261] " National| Branch| Vice President| J2Ee| Software"
## [262] " NAV calculation| Fund accounting| Automation| Corporate actions| Accounting| Process improvement| Analytical| Reconciliation| Standard operating procedures| Subject Matter Expert"
## [263] " NCTVT"
## [264] " Negotiation| Marine Operation| Oracle Fusion| Manufacturing| Inventory"
## [265] " Network"
## [266] " networking| information technology| network administration| technical support| support services| license management| disaster recovery| data security| it training| it software"
## [267] " Networking| It Asset| Antivirus| Hardware Troubleshooting"
## [268] " Networking| Secondary research| Recruitment| Analyst| Network security| Research| IPS| Advisory| Firewall"
## [269] " Networking| Telecom| LAN| WAN| Bss| VPN| Wireless| Telecommunication| Costing| Visio"
## [270] " Networking| Unix| Change management| Scheduling| Publishing| Incident management| VMware| Problem management| Remedy| SIP"
## [271] " NSE| Lead generation| Compliance| Relationship| Equity| Client acquisition| Research| Revenue generation| Monitoring| HNI client handling"
## [272] " Nursing| NICU| Medical | patient care| Nurse"
## [273] " ODI| Matrix"
## [274] " operations management| mobilization| Resource Mobilization| general management| interview| Recruitment"
## [275] " Operations| Inventory Management| Vendor Management| Bhm| Hospitality| Front Office| Guest Relations| Hospitality Management| hotel management"
## [276] " operations| workflow| tat| monitoring| mts| email"
## [277] " Oracle database| server| VB.NET| technical| tools| sql| Sql Server 2008| database| design| MS.net| Application development| Test cases| net| deployment| Automation| development| c| oracle| testing| specification| vb| quality| application| PLSQL| pl| support| WIP"
## [278] " oracle sales"
## [279] " Order Management system| Sterling Commerce| Sterling| OMS| Sterling Integrator| ecommerce| E - commerce"
## [280] " Outbound Sales| tele sales| Sales Executive Activities"
## [281] " Outbound| Antivirus| Comp| Technical support| Technical Support Associate| technical sales associate| Sales| Technical Associate| Voice support| Inbound calls"
## [282] " Outbound| Antivirus| Technical support| Sales| Spot| Inbound calls| pay| Medical| Comp"
## [283] " Outbound| Antivirus| Technical support| Technical Support Associate| process| Sales| Inbound calls| US shift| Comp"
## [284] " Outbound| Antivirus| Technical support| Voice process| Technical Support Executive| US shift| Inbound voice process| Customer Service Executive| Comp| International BPO"
## [285] " Outbound| Medical| Technical support| Technical Support Associate| Email| Sales| US shift| Antivirus| Troubleshooting| Comp"
## [286] " Outbound| Medical| Technical support| Technical Support Associate| Email| Technical| US shift| Antivirus| Troubleshooting| Comp"
## [287] " Outbound| Night shift| Recruitment| iPhone| Email| US shift| Troubleshooting| Technical support| Comp| International BPO"
## [288] " Outbound| Night shift| Service| English| process| Technical| Technical support| Inbound calls| Voice process| Group"
## [289] " Outbound| Sales| Project management| Analytical| Sales Lead| Automation tools| Sales process| marketing automation"
## [290] " Outbound| Service| Technical support| process| Inbound calls| Domestic BPO| Bonus| Business Executive| Comp"
## [291] " Outbound| Technical Support Associate| Email| Technical| US shift| Medical| Antivirus| Troubleshooting| Technical support| Comp"
## [292] " Outbound| Technical Support Associate| Sales process| process| Senior| Technical| US shift| Technical support| International BPO"
## [293] " Outbound| Telesales| Night shift| English| process| Technical| Inbound calls| Service| Printers| Business Executive"
## [294] " Patient Care| Nursing| People Orientation| Report Generation| Service Quality| Disaster Management| Customer Care| Medical| Process Orientation"
## [295] " Pay Per Click| Google AdWords| Search Engine Marketing| PPC| SEM| Google Analytics| Website Analysis| Yahoo| Web Analytics| Marketing Initiatives"
## [296] " Payment collection| Costing| Business Development Executive| Lead generation| Sales| Vendor| Cost"
## [297] " Performance management| Analytical| Design development| Conceptualization| HR| Continuous improvement| Sales support| Recruitment| Testing"
## [298] " Performance Testing| Software Testing| Manual Testing| Quality Testing"
## [299] " pharma chemicals| business development| api| intermediates| sales"
## [300] " pharmaceutical| medical| Pharma| medical billing| healthcare"
## [301] " Photoshop| HTML| Wordpress| CSS3| bootstrap| Web technologies| html5| CSS"
## [302] " Photoshop| Illustrator| Fine arts| Software design| User interface designing| game development| creative content| Supervision| Relationship Executive| Business Executive"
## [303] " photoshop| illustrator| seo| jquery| fireworks| css3| gui| usability| development| static"
## [304] " PHP| Networking| Data structures| HTTP| JSON| Software design| Computer science| System design| Backend| Ticketing"
## [305] " Pivot Table| Credit Analysis| Tally ERP| Accounting| VLOOKUP| Finance| Lookup| Advanced Excel| HLOOKUP| Credit Control"
## [306] " planning| training| training manager| trainer| faculty"
## [307] " pnr| primetime| sta| floorplan| timing closure| synthesis| vlsi| Physical design| floor planning"
## [308] " PR| international bpo| chat process| Aviation| back office| web chat| Guest Relations| Public Speaking| bcom| fresher| inbound process| outbound| uk process| icse| communication skills| cbse"
## [309] " PR| Public Relations| Media Relations| Social Media| Marketing Communication| corporate communication| media relation| corp comm| Online Media| public relation| Journalism| Advertising| mass communication"
## [310] " pre sales| closing| software knowledge| clients| requirements| negotiating| client| online bidding| good communication| technology"
## [311] " Predictive Modeling| SAS| Data Management| Data Mining| Tableau| Data Analytics| Statistics| Analytics| SQL| Python"
## [312] " Presales| Real Estate Sales| Residential Sales| Sales Executive Activities"
## [313] " Process automation| Commodity Markets| Artificial Intelligence| Market intelligence| Machine learning| Corporate| Relationship| Operations| Analytics| Robotics"
## [314] " process| Spot| Technical support| Night shift| International BPO"
## [315] " Procurement| Business process| IT services| Automation| data services| Master data management| Consulting| Vendor| Troubleshooting| Business Executive"
## [316] " Procurement| Supply chain management| Automation| Copyright| Chain| Purchase| Head Operations| Steel| Business Executive"
## [317] " Product management| Business process| Linkedin| Automation| CV| Email| GIT| Technical| SDLC| Ideas"
## [318] " product management| product pricing| sales| market research| user experience| marketting| asm| tsm| sales manager"
## [319] " Product placement| Market research| Distributor handling| Business Development Executive| Customer service| Customer Service Executive| Secondary sales| Supervision"
## [320] " Product training| Sales| Relationship| Banking| Recruitment"
## [321] " Production Management| production control| production planning| Production Manager| Planning| Production Support| Organizing"
## [322] " Production Management| Weld Shop| Press Shop| pressing| sheetmetal"
## [323] " Project Administration| Coordination"
## [324] " Project Management"
## [325] " project management| management consulting| business transformation| strategy consulting| change management| sales strategy| top management"
## [326] " Project management| PPAP| Automotive| External audit| Conflict resolution| Resource mobilization| PFMEA| Risk management| Project life cycle"
## [327] " project sales| Architects| Sales Operations| Sales Management| distributor| interior designers| Area Management| contractors| Area| Developers| consultants| dealer| territory management| Sales Manager"
## [328] " project support| Banking| Maya| E-commerce| big data"
## [329] " Publishing| SEO| Content management| Social media| Wordpress| Management systems| Research| Brand awareness| Web technologies| Journalism"
## [330] " Python"
## [331] " python| open source| database| Automation| java| linux| perl| Monitoring| nosql"
## [332] " Python| Six Sigma| PMP| .NET| HTML| JavaScript| SQL| Oracle| assembly language| Real Time Operating Systems"
## [333] " QA Executive"
## [334] " QA| Data management| GDB| Fixed income| Data quality| HTTP| Operations| Python"
## [335] " QA| Functional testing"
## [336] " QA| Life Sciences| development quality assurance| Life Cycle| Regulatory Affairs| DQA| QMS| Dmf"
## [337] " qmail| workflow| nagios| windows server| networking| mysql| monitoring| redhat| maintaining| centos"
## [338] " QMS| Impex| Environmental Management System| Warehouse Management System| Export Import Logistics"
## [339] " Real Estate Construction| Project Management| Interpersonal Communication| Communication Skills| Project Manager| Project Coordinator| site coordinator"
## [340] " Receptionist| Administration| Front Desk| Travel Arrangements| Front Office| Computer Operating"
## [341] " Recruitment| Hiring| HR| Screening| Interviewing| Staffing"
## [342] " Recruitment| Outbound| Technical support| English| Comp| Email| Troubleshooting| Domestic BPO| International BPO| Inbound calls"
## [343] " Relationship management| Relationship building| Client relationship| Training| Analytical skills| Process mapping| Standard operating procedures| Agile| Management| Visa processing"
## [344] " Report Generation| Policies| analytical| procedures| Analysts| Data Entry| analytical skills"
## [345] " Reporting| Data Analysis| Business Analytics| Data Analytics| kpo"
## [346] " rest| java| sql| oop| angularjs| ui development| oracle"
## [347] " Retail Sales| Sales Executive Activities| Revenue Generation| Inhouse Sales"
## [348] " Retail| marketing executive| distributors| customer profiling| sales strategy| SME| market research| Business Development| Operations| sales executive"
## [349] " Revenue Cycle Management| US Healthcare| Payment Posting| Medical Billing| Medical Coding| us visa| Team Leading Skills| Healthcare| Denial Management| RCM"
## [350] " revenue generation| marketing| ad sales| web technologies"
## [351] " RT| PT| MPI| NDT Inspection| NDT Level| Diploma| Quality Inspection| Level Ii| Inspection Engineering| Mechanical Engineering| UT"
## [352] " Sales Associate| support| Voice process| Issue| Senior| Technical| Inbound calls| Bonus| US shift| Software"
## [353] " Sales Engineer| solution architect| Presales| solution consultant| Technology Consultant"
## [354] " sales engineer| Technical Sales| Sales Executive Activities"
## [355] " Sales Engineering"
## [356] " Sales Executive| Cold calling| market research| customer profiling| sales executive| marketing executive| distributors| Business Development| sales strategy"
## [357] " Sales Head| Hospitality| Office automation| Residential sales| Sales strategy| Bfsi| management| Real estate sales| Flex| Executive search"
## [358] " Sales Head| Tied Channel| Sales| Business Growth| Profitability| Business Operations| New Business| Alliances"
## [359] " sales manager| business development manager| relationship manager| brokers| insurance sales| channel sales| direct sale| direct marketing| sales| Marketing Executive| Territory Sales Manager"
## [360] " sales strategy| sales management| B2B Sales| corporate sales| institutional sales"
## [361] " Sales| Billing| MS Office| Business reporting| Insurance sales| MIS preparation| Usage| Corporate| Networking| Retail"
## [362] " Sales| Business Development| Change Management| Mobile| mobiles| handset| mobile handset| Marketing| Relationship Management| Distribution Management| channel management| dealer management| Retailer"
## [363] " Sales| Fresher| Marketing"
## [364] " Sales| insurance sales| agency sales| Direct sales| life advisor| channel sales| life insurance advisor| life insurance| agency"
## [365] " Sales| Management| Sales management| Educational sales"
## [366] " Sales| Marketing"
## [367] " Sales| Sale| Networking Sales| It Solution Sales| Structured Cabling| Passive Networking| Data Center| Cable Tray| cabling| Data Center Rack| data - centre rack| LAN| UTP Cables"
## [368] " Sales| Team Building| Strategic Leadership| Real Estate| Field Sales| Sales Strategy| Enterprise Business| Go - to - market Strategy| Enterprise sales| Sales Executive Activities| Marketing"
## [369] " Salesforce Developer| sfdc developer| Salesforce"
## [370] " salesforce| salesforce.com| system design| application architecture"
## [371] " SAP PLM| SAP MM| SAP EHS"
## [372] " sap| procurement| scm| material| sheetmetal| sheet metal| purchase| VD| vendor development| sourcing| BOP"
## [373] " Screening| Linkedin| IT Recruitment| hr recruitment| Database| recruiter| Sourcing| Interviewing| Recruitment"
## [374] " sds| radiology| CPT| icd - 10| EM| medical coding| coders| surgery| ed"
## [375] " Secondary Research| Valuation| Finance| Real Estate| Primary| Report Preparation| Business Development| Due Diligence| Financial Modelling"
## [376] " secretary| executive assistant| ea"
## [377] " selling| accounts| events| prospecting| business operations| ideas| coordinating| tracking| closing| maintaining"
## [378] " Senior Design Engineer| Engineering Design| SACS"
## [379] " Senior management| MIS reporting| Building| Training| Management| Risk| Vice President| Focus| Trade| Associate Vice President"
## [380] " senior management| ngo| key skills| Corporate Social Responsibility| Govt Liasioning| corporate pr| External Communications"
## [381] " server| multimedia| troubleshooting| graphics| audio| monitoring| javascript| jquery| user interface| css3"
## [382] " Service delivery| Bfsi| enterprise mobility| Market intelligence| Tools| Application development| Sales process| microsoft| Middleware| Business Executive"
## [383] " service engineering| maintenance| breakdown| shutdown| amc| installation| repair| troubleshooting| field service engineer| Preventive Maintenance| breakdown maintenance| Field Engineer| Electrical Engineer"
## [384] " Service level| Data management| HR Coordinator| Management audit| HR operations| Human resource management"
## [385] " set| eee| interpersonal skills| selling| sales marketing| travel| marketing management| hardware"
## [386] " shares| market research| communication skills"
## [387] " single sign - on| single sign on| IT Infrastructure| SSO"
## [388] " soa| sql| relationship management| server| software| jquery| service oriented architectures| quality systems| software implementation| computer science| sql server 2008| design"
## [389] " software development life cycle| css| html5| ui development| design patterns| svn| software engineering| angularjs| javascript"
## [390] " spanish language expert| chinese| spanish| medical"
## [391] " spring boot| spring security| spring mvc"
## [392] " Sql Server 2008| Cognos| MVC| SIDE| server| java| asp.net| Javascript| Problem| developer| ASP.Net MVC| sql"
## [393] " SQL| Android| jQuery| UML| Coding| Graphics| JSON| Test cases| System testing| SQLite"
## [394] " SQL| NoSQL| R| Python| Scala| Data Visualization| Machine Learning| Data Science| Data Modeling| Algorithm"
## [395] " SQL| Oracle| Cognos| Business intelligence| Automotive| Supply chain| DBMSTools| metadata"
## [396] " SQL| Python| Analytics| Machine learning| Solution architecture| Analytical| SCALA| Cosmos| Programming| Data warehousing"
## [397] " SSRS| SQL Server| Stored Procedures| SQL Development| MS SQL"
## [398] " Staff Training| Day Care| Recruitment"
## [399] " Stores| warehouse| Logistics"
## [400] " Strategic Sourcing| procurement| supply chain management| Packaging| Vendor Management"
## [401] " T-SQL| Web technologies| data manipulation| MIS| XML| Data structures| System Analyst| JSON| Scripting"
## [402] " Talent Acquisition| Recruitment| HR| Campus Hiring| recruitment| recruiting"
## [403] " Tally| Retail| Accounts Executive| Retail Executive"
## [404] " TDS| Financial statements| Invoice processing| business opportunity| Interpersonal skills| Tally ERP| Accounting| Analytical| Accounts receivable| Recruitment"
## [405] " Tea| Coffee| Office Assistance| admin| office assistant| computer operator"
## [406] " Teaching| Educator| Counselor| Mentor| Trainer| Advisor"
## [407] " Team Management| Advisory Services| General Insurance| Sales Initiatives| Financial Products| Distributor Sales| Branch Sales| Sales Development| Motor Insurance| Marketing"
## [408] " Team Management| Project Execution| Program Management| Customer Experience| Data Analytics| Supply Chain| Operations Planning"
## [409] " Team management| Regional sales| Management"
## [410] " Team management| Salesforce| Usage| Sales| Skill development| Training| Productivity improvement| Training management| Sales budgeting| TSI"
## [411] " Team Management| Training Need Analysis| sales training| Retail Sales| MS Office| Product Training| Training| Team Building| Skill Development| Retail Marketing| trainer| Regional Management| Competency Mapping| Training Delivery"
## [412] " Technical Architecture| Fusion| Oracle Fusion"
## [413] " Technical Management| Agile Methodology| Unit Testing| Design Development| Business Analytics| Big Data| SQL Queries| Spark| Performance Tuning| Test Case Design"
## [414] " technical recruitment| us staffing| us recruitment| us recruiter| us it staffing| technical recruiter| it recruiter| recruiter| w2| c2c| talent acquisition| recruitment| staffing| sourcing"
## [415] " Technical Support"
## [416] " Technical Support Executive| Electrical engineering"
## [417] " Technical support| English| Comp| Customer Care Executive| Inbound calls| Antivirus| Issue| Software"
## [418] " Technical support| Outbound| Comp| Technical| Domestic BPO| US shift| process| Inbound calls| Bonus"
## [419] " Technical support| Outbound| Troubleshooting| RecruitmentEnglish| Antivirus| Comp| Customer Service Executive| Domestic BPO"
## [420] " Technical support| SAN| Veritas| Data management| NetBackup| Windows OS| WebEx| Unix operating system| TCP/IP| IT infrastructure"
## [421] " technical support| support services| application support| communication skills| voice based process| semi voice| semi voice process"
## [422] " Technical Writing| Technical Documentation| Articles| Writing Skills| Product Support"
## [423] " Testing| Quality| Manual Testing| ETL| BI| DW| Datawarehouse Testing"
## [424] " TFS| Azure| Git| VSTS| Docker| DynaTrace| Splunk| AWS"
## [425] " Tourism| target achievement| negotiation skills| revenue management| Tour Packages"
## [426] " Trade| Forex Trading| Forex| fx| Lead Generation| Accounting| Banking| Revenue Generation| Current Account"
## [427] " Training Needs| Soft Skills| Accent| HR| Feedback| Coaching| Customer Service| Process Compliance"
## [428] " Troubleshooting| DNS| DHCP| Monitoring| Virtualization| Shell scripting| Python| VMS| Open source| Archiving"
## [429] " Unix"
## [430] " Unix| data science| SQL| Linux| SAS| HTML| Perl| SDLC| Android| Python"
## [431] " Unix| PDF| Deployment| Informatica| Oracle| Teradata| Troubleshooting| Data warehousing"
## [432] " Unix| Version control| Prototype| XML| MySQL| PHP| JSON| MVC| Ajax| CSS3"
## [433] " us it recruiter| us it recruitment| us it staffing| us staffing| us technical recruiter| us recruitment"
## [434] " Usage| PDF| C| Social media| Cash handling| Database| Customer service| Merchandising| Advertising"
## [435] " Validation| Installation| Breakdown Maintenance| Industrial Safety| gmp| Boiler| Design| HVAC| Gensets| Air Compressor| Breakdown| RO| who"
## [436] " Virtualization| Cloud computing| Server architecture| Windows Troubleshooting| Customer satisfaction| Manager Technology| Deployment| Management"
## [437] " visualization| m e p| modeling| drafting| design development| drawings| cad| preparation| quality"
## [438] " Voice process| qaqc| Writing| Process operations| Verbal"
## [439] " Web development| Analytics| Healthcare| Software design| Monitoring| JIRA| Computer science| Backend| Inside sales| Cloud"
## [440] " WebLogic| configuration| MySQL| installation| Oracle DBA| troubleshooting| Oracle RAC"
## [441] " website| facebook| online| Twitter| seo| internet| search engine optimisation"
## [442] " website| web analytics| xml| link building| google analytics| case studies| seo| social media| tracking| maintaining"
## [443] " Wireless| Automation| Simulation| Networking| Aerospace| FPGA| Coding| System verilog| Automotive| Physical design"
## [444] " worldspan| travel sales consultants| galileo| amadeus| gds"
## [445] " X - Ray| Medical Transcription| Ultrasound| CT Scan"
## [446] " XML| Javascript| PHP| development| css| technical| analytical| software| testing| HTML| tools| Joomla| coding| jQuery| web| MySQL| Wordpress| design| XHTML| debugging| Ajax"
## [447] " zld| Engineering Management| knitting"
## [448] "arm processor|c|device drivers|embedded linux|linux kernel|ipc"
## [449] "C#|Application Development|Senior Level|MS SQL|Visual Basic|Power Bi|MSBI|SSIS|Recruitment|Data Integration"
## [450] "coding|database design|test cases|analytical|nosql|cassandra"
## [451] "Design Development|Software Engineering|Lighting|Computer Science|Product Quality|Automation Testing|Asset Management|GUI|Object Oriented Programming|Android"
## [452] "Detail Design|Juniper|SMSC Engineer|Routing|IP Networking|Network Elements|Network Troubleshooting|High Level Design|Data Center|Switching"
## [453] "digital marketing|email marketing|adwords|display advertising|digital campaigns|google analytics|sem|seo"
## [454] "Execution|Project Management|AO engagement|Monitoring Tools|Delivery Management|Stakeholder Management|System Monitoring"
## [455] "Installation|Breakdown Maintenance|Preventive Maintenance"
## [456] "Java|Angular JS|Hibernate|Core Java|Technical Leader|Technical|Javascript|Spring|JQuery|JS framework"
## [457] "Java|Trainer|Java|trainer|Trainer|java|Trainer|Java|Trainer|Java|Trainer|Java|Trainer|Java|Trainer|Java|Trainer|Java|Trainer|Java|Trainer|Java|Trainer|Java|Trainer|JAVA|TRAINER|JAVA|TRAINER|Java|Trainer|Java|Trainer|Java|Trainer|trainer|Trainer|Trainer|Java|Trainer|Java|Trainer|Trainer|Java|Java|Trainer|Java|Trainer|Java|Trainer|JAVA|TRAINER|Java|Trainer|Java|Trainer|Trainer|Trainer|Trainer|Trainer|Trainer|Trainer|Trainer|Java|Java|Java|trainer|Java|Java|Java|Trainer|JAVA|Java|Java|Trainer|Java"
## [458] "kaggle|NLP|data science|Artificial Intelligence|Natural Language Processing|analytical techniques|Text Mining|big data|machine learning|Deep Learning"
## [459] "Manager|Transformation|Manager|Transformation|Manager|Manager|Manager|Manager|Transformation|Manager|Transformation|Manager|Manager|Transformation|Manager|Manager|Transformation|Transformation|Manager|Manager|Manager|Manager|Manager|Manager|Manager|Manager|Manager|Manager|Transformation|Manager|Manager|Manager|Manager|Manager|Manager|Transformation|Manager|Manager|Manager|Manager|Manager|Manager|Manager|Transformation|Manager|Transformation|Manager|Manager|Manager|Transformation|Manager|Transformation|Manager|Manager|Transformation|Manager|Manager|Manager|Manager|Manager|Manager|Manager|Manager|Transformation"
## [460] "market penetration|marketing|customer satisfaction|enterprise business|web technologies|business development|strategy|aws|sales"
## [461] "Marketing|Executive|Marketing|Marketing|Executive|Direct|Executives|Marketing|Executive|Executive|Executive|Executive|Marketing|Executive|Marketing|Executive|direct|marketing|executive|Marketing|Executive|Marketing|Executive|Executive|Marketing|Executive|direct|Executive|Direct|Marketing|Executive|Executive|Direct|Marketing|Marketing|Executive"
## [462] "mechanical operation|preventive maintenance|mechanical|engineeringbreak down maintenance|mechanical maintenance"
## [463] "networking|Network|Lead|Network|Lead|Network|Network|Lead|Network|networking|Lead|Leading|Network|Lead|Network|Lead|Network|Leading|Lead|Network|Network|Lead|Network|Lead|lead|Lead|Network|Network|Lead|Network|Network|Network|Lead|Networking|Lead|Lead|Network|Lead|Networking|Lead|Lead|Network|Network|Lead|Network|Networking|Lead|Lead|Lead|Lead|Network|Network|Lead"
## [464] "O2C|OTC|Order Management|Credit Management|Communication Skills"
## [465] "Oracle IDAM|OIM|OAM"
## [466] "Oracle|Core Java|Business process|Outsourcing|Operations|spring integration|J2Ee|Spring framework|JEE|Manager Technology"
## [467] "Product management|Analytical skills|software architecture|Prototype|Business analysis|Manager Technology|Outsourcing|Resource management|Operations|Solution architecting"
## [468] "Recruitment|Volume Hiring|HR|BPO Hiring|Sourcing|Interviewing|Onboarding|Staffing|Orientation|Human Resource Management"
## [469] "Renewable energy|Power distribution|Power sector|Banking|Electricals"
## [470] "Sales|Counter|Sales|Sales|Sales|Sales|Counter|Sales|Sales|Sales|Counter|Sales|Sales|Counter|Sales|Sales|Sales|Sales|Sales|Counter|Sales|Sales|Sales|Sales|Counter|Sales|Sales|Sales|Sales|Sales|Sales|Counter|Sales|Sales|Sales|Sales|Sales|Sales|Sales|Sales|Sales|Sales|Counter|Sales"
## [471] "SQL|Hibernate|Multithreading|OOAD|Eclipse|Business process|Outsourcing|Version control|Memory management|Control system"
## [472] "Test Engineering"
## [473] "vide"
## [1] "----- Role.Category , num categorias: 60 -----"
## [1] ""
## [2] " ZS pioneers in sales force and marketing analytics applying optimization techniques to sales force and marketing investment problems. We have grown significantly and are now recognized global leaders in sales and marketing consulting. A key enabler of our services is leveraging data in delivering client solutions. The data available about customers across Healthcare and multiple industries is getting richer and the problems that our customers are trying to answer continue to evolve. In our endeavor to stay ahead of curve in providing solutions to these evolving complex business problems, ZS has set up a Data Scientist track which has following major focus areas: Research the evolving datasets and newer information sources to understand the possibilities Apply advanced analytical techniques and algorithms to improve current as well as develop cutting edge offerings/solutions Deliver client impact by collaboratively implementing and broad basing these solutions Provide thought leadership by developing the ZS Point of View in the industry The Manager position is the precursor to the Associate Principal and Principal Positions, and therefore part of the ZS leadership ladder. Every Manager leads one or more Spaces, i.e. business units focused either on a specific client, or a specific expertise area. Therefore ZS Data Science Managers are responsible for strong analytical expertise, knowledge and experience of various machine learning algorithms, tools & big data technologies, leveraging this knowledge for innovation, thought leadership, stakeholder relationship management, effectively coaching and responsible for people growth and defining-running-refining their space operating models, guided closely by Principals. Managers leverage their experience to take responsibility for providing analytical solutions across projects, deliver quality work for clients and lead client and ZS-leader relationships from beginning of their tenure. Provide expertise in architecting and implementing analytical solutions for projects Manage projects and assist in managing stakeholder relationships Direct multiple projects simultaneously, honing analytical and project management skills Motivate, coach and serve as a role model for space team members Provide thought leadership and innovation within projects and across practice areas Partner with onshore colleagues to develop new business with existing and new clients Develop and implement specific frameworks for strategy and programs Contribute to ZSs capability building and knowledge creation Coach, mentor, and conduct training programs Play an active role in India office growth related initiatives (e.g. recruiting, training, etc.). Required Candidate profile Managers have 8 - 12 years work experience in industry through consulting work or within an industry leader (a combination of experience is preferred) BE/ B.Tech / BS (stats) from Tier-1 institute would be required. PhD in Computer Science (OR Statistics) / M.Tech / MS from a premier institute would be highly preferred Substantial experience in Machine Learning Knowledge of big data/ advanced analytics concepts and algorithms text mining, social listening, recommender systems, predictive modeling, etc. Knowledge of programming Java/Python/R Exposure to tools/platforms Hadoop eco system and DB systems Agile project planning and project management skills Excellent communication skills In addition, we seek individuals with the following Desire to make a business impact for our clients Leadership experience Personal initiative and strong work ethic Self-motivation and detail orientation Organization & planning skills Communication skills Salary: Not Disclosed by Recruiter Industry: Strategy / Management Consulting Firms Functional Area: Other Employment Type: Full Time, Permanent "
## [3] "Accounts"
## [4] "Admin/Maintenance/Security/Datawarehousing"
## [5] "Administration/Facility Management"
## [6] "Advertising"
## [7] "Analytics & BI"
## [8] "Architectural Services"
## [9] "Back Office/Web/Transaction Processing"
## [10] "Channel Sales"
## [11] "Content Development"
## [12] "Corporate Planning/Consulting/Strategy"
## [13] "Corporate Sales"
## [14] "Creative"
## [15] "CSR & Sustainability"
## [16] "Drug Regulatory Affairs/Documentation"
## [17] "Engineering Design"
## [18] "Equipment installation, calibration, validation and maintenance. Maintain the master list for preventive maintenance and calibration of GLP AND NONGLP Instruments Preparing the IQ,OQ,PQ Documentation for new equipment during installation Attend and rectifying the CENTRIFUGE,CO2 INCUBATOR ,HPLC, CENTRIFUGE, CELLCOUNTER, HPLC, ROTAVAPORS, INCUBATORS, WATER PURIFICATION SYSTEMS, FPLC breakdown issues Attend and rectifying the HPLC breakdown issues Coordinating with Vendors, Projects team, Validation team and end-users for installation and qualification (IQ, OQ and PQ) of all the Biologics department equipment. Zero down time maintenance of all laboratory department equipment. Maintaining stock of equipment accessories, spares and consumables as per requirement. To assist, attend and Execute Preventive Maintenance/Breakdown Maintenance for Various Biology and Analytical equipment. Attend breakdown Maintenance calls and Perform routine Preventive Maintenance for Instruments like CENTRIFUGE, CELLCOUNTER, HPLC, ROTAVAPORS, INCUBATORS, WATER PURIFICATION SYSTEMS, HEATING STIRRERS, FLASH CHROMATOGRAPHY SYSTEMS AND VARIOUS BIO-ANALYTICAL INSTRUMENTS IN JUBILANT BIOSYS. Working with Scientists to ensure smooth running of the Equi Salary: Not Disclosed by Recruiter Industry: Pharma / Biotech / Clinical Research Functional Area: Other Employment Type: Full Time, Permanent "
## [19] "Finance/Audit"
## [20] "Food & Beverage"
## [21] "Front Office/Customer Care"
## [22] "General Insurance"
## [23] "Health & Fitness"
## [24] "Housekeeping"
## [25] "HR/ Recruitment / IR"
## [26] "Institutional Sales"
## [27] "Investment Banking"
## [28] "Journalist/Writer"
## [29] "Logistics"
## [30] "Marketing"
## [31] "Medical Professional"
## [32] "Online/Digital Marketing"
## [33] "Operations"
## [34] "Operations/Processes/Finance/Legal"
## [35] "Other"
## [36] "Pre Sales"
## [37] "Production/Manufacturing/Maintenance"
## [38] "Production/Merchandising/Business Development"
## [39] "Programming & Design"
## [40] "Project Management"
## [41] "Public Relations"
## [42] "Purchase/Material Management"
## [43] "QA/Testing/Documentation"
## [44] "Quality"
## [45] "R&D"
## [46] "Retail Sales"
## [47] "Retail/Personal Banking"
## [48] "Safety/Health/Environment"
## [49] "Sales Support"
## [50] "Senior Management"
## [51] "Site Engineering"
## [52] "Subject Teachers (TGT/PGT)"
## [53] "Suguna Group was founded in the year 1984 with the inception of Suguna Foods in poultry sector by first generation entrepreneurs. Suguna is a USD 1.3 billion (INR 9,000 cr) group and leader in Indian protein food/animal farming industry. With an employee footprint of more than 8500, the group is in to poultry, dairy, processed protein food, animal nutrition, healthcare & biologicals. Group companies are Suguna Foods, Suguna Dairy, Globion, Aminovit Srilanka, Suguna Bangladesh and Kenya. Suguna Foods is the largest poultry enterprise in India and it ranks among the top 10 worldwide. The fully integrated operations cover broiler and layer farming, hatcheries, feed mills, processing plants, vaccines and exports. Suguna markets live broiler chicken, value added eggs, ready-to-eat and ready-to-cook chicken products. With the intent to provide consumers with fresh, clean and hygienic packed chicken, Suguna has set up a chain of modern retail outlets in the name of ‘Daily Fressh’. Suguna Foods pioneered contract farming in poultry industry, and now has presence in 21 states in India. Suguna as a brand is known for its quality products which has been well accepted by the consumers. Suguna Group always believes in energising rural India and providing nutritional security to India and is proud to associate with the mission of improving livelihood of 38,000 farmers"
## [54] "System Design/Implementation/ERP/CRM"
## [55] "Teachers"
## [56] "Technical Support"
## [57] "Ticketing/Travel/Documentation"
## [58] "Training"
## [59] "University Level"
## [60] "Voice"
## [1] "----- Location , num categorias: 102 -----"
## [1] ""
## [2] " Bengaluru"
## [3] " Delhi NCR"
## [4] " Gurgaon"
## [5] " Hyderabad"
## [6] " Hyderabad, Bengaluru"
## [7] " Mumbai"
## [8] "Ahmedabad"
## [9] "Ahmedabad (Ellisbridge) "
## [10] "Ahmedabad,Ahmedabad"
## [11] "Ahmedabad,Bharuch"
## [12] "Ahmedabad,Gandhinagar"
## [13] "Ahmedabad,Gandhinagar,Vadodara"
## [14] "Ahmedabad,Indore"
## [15] "Ambala,Gurgaon"
## [16] "Bengaluru"
## [17] "Bengaluru (Bellandur) "
## [18] "Bengaluru (Vasanth nagar) "
## [19] "Bengaluru,Bengaluru / Bangalore"
## [20] "Bengaluru,Chennai"
## [21] "Bengaluru,Chennai,Hyderabad,Greater Noida"
## [22] "Bengaluru,Hyderabad"
## [23] "Bengaluru,Hyderabad (1) ,Gurgaon,...More"
## [24] "Bengaluru,Hyderabad,Chennai,Mumbai"
## [25] "Bengaluru,Hyderabad,Kolkata,Chennai"
## [26] "Bengaluru,Hyderabad,Mumbai"
## [27] "Bengaluru,Mumbai,Delhi"
## [28] "Bengaluru,Pune"
## [29] "Bhilai/Bhillai,Bhilwara,Bhopal,Bhubaneshwar,Bikaner,Bilaspur,Bokaro,Chandigarh,Burdwan"
## [30] "Bhopal,Ahmedabad,Vadodara"
## [31] "Chandigarh"
## [32] "Chandigarh,Chandigarh"
## [33] "Chandigarh,Mohali,Panchkula"
## [34] "Chandigarh,Panchkula"
## [35] "Chennai"
## [36] "Chennai Vellore,Salem Erode,Madurai Trichy"
## [37] "Chennai,Bengaluru"
## [38] "Chennai,Gurgaon"
## [39] "Chennai,Gurgaon,Bengaluru"
## [40] "Chennai,Hyderabad,Trivandrum"
## [41] "Chennai,Thanjavur,Karur,Salem,Hosur,Coimbatore"
## [42] "Coimbatore,Raipur,Visakhapatnam,Pune"
## [43] "Delhi"
## [44] "Delhi (Bhikaji Cama) "
## [45] "Delhi NCR"
## [46] "Delhi NCR (Green Park) "
## [47] "Delhi NCR (Shakti Nagar) "
## [48] "Delhi NCR (Sunder Nagar) "
## [49] "Delhi NCR,Agra,Aligarh,Bareilly,Faridabad,Ghaziabad,Meerut,Moradabad,Muzaffarpur"
## [50] "Delhi NCR,Bengaluru"
## [51] "Delhi NCR,Bhiwadi"
## [52] "Delhi NCR,Chandigarh"
## [53] "Delhi NCR,Chandigarh,Mohali"
## [54] "Delhi NCR,Delhi"
## [55] "Delhi NCR,Delhi,Greater Noida,Gurgaon,Noida"
## [56] "Delhi NCR,Ghaziabad,Noida"
## [57] "Delhi NCR,Gurgaon"
## [58] "Delhi NCR,Gurgaon,Delhi"
## [59] "Delhi NCR,Gurgaon,Noida"
## [60] "Delhi NCR,Kolkata,Chandigarh"
## [61] "Delhi NCR,Mumbai"
## [62] "Delhi NCR,Mumbai,Bengaluru"
## [63] "Delhi NCR,Mumbai,Pune,Ahmedabad,Gurgaon,Nagpur,Gujarat,Maharashtra,Nashik"
## [64] "Delhi NCR,Mumbai,Pune,Ahmedabad,Nagpur,Nashik,Gujarat,Maharashtra"
## [65] "Delhi NCR,Noida"
## [66] "Delhi,Delhi"
## [67] "Delhi,Gurgaon"
## [68] "Faridabad"
## [69] "Faridabad,Gurgaon,Mumbai"
## [70] "Ghaziabad"
## [71] "Greater Noida"
## [72] "Gurgaon"
## [73] "Gurgaon,Australia"
## [74] "Gurgaon,Gurgaon"
## [75] "Gurgaon,haryana"
## [76] "Gurgaon,Manesar"
## [77] "Gurgaon,Mumbai,Pune,Cuttack,Chennai,Kanpur,Kolkata,Raipur"
## [78] "Gurgaon,Noida"
## [79] "Hyderabad"
## [80] "Hyderabad,Bengaluru"
## [81] "Kolkata"
## [82] "Manesar,Gurgaon,haryana"
## [83] "Mohali,Chandigarh"
## [84] "Mumbai"
## [85] "Mumbai (Sakinaka) "
## [86] "Mumbai,Bengaluru"
## [87] "Mumbai,Delhi"
## [88] "Mumbai,Indore,Pune"
## [89] "Mumbai,Mumbai"
## [90] "Mumbai,Mumbai Suburbs"
## [91] "Mumbai,Mumbai Suburbs,Navi Mumbai,Thane,Vasai"
## [92] "Mumbai,Pune"
## [93] "Mumbai,Thane"
## [94] "Navi Mumbai"
## [95] "Noida"
## [96] "Noida,Delhi,Noida/Greater Noida"
## [97] "Noida,Noida/Greater Noida"
## [98] "Pune"
## [99] "Pune,Gurgaon"
## [100] "Pune,Pune"
## [101] "Thane"
## [102] "Thane,Mumbai,Navi Mumbai"
## [1] "----- Functional.Area , num categorias: 41 -----"
## [1] ""
## [2] "Accounts , Finance , Tax , Company Secretary , Audit"
## [3] "Analytics & Business Intelligence"
## [4] "Architecture , Interior Design"
## [5] "Beauty / Fitness / Spa Services"
## [6] "CSR & Sustainability"
## [7] "Design , Creative , User Experience"
## [8] "Engineering Design , R&D"
## [9] "Executive Assistant , Front Office , Data Entry"
## [10] "Export , Import , Merchandising"
## [11] "Financial Services , Banking , Investments , Insurance"
## [12] "Hotels , Restaurants"
## [13] "HR , Recruitment , Administration , IR"
## [14] "IT Hardware , Technical Support , Telecom Engineering"
## [15] "IT Software - Application Programming , Maintenance"
## [16] "IT Software - DBA , Datawarehousing"
## [17] "IT Software - eCommerce , Internet Technologies"
## [18] "IT Software - Embedded , EDA , VLSI , ASIC , Chip Design"
## [19] "IT Software - ERP , CRM"
## [20] "IT Software - Mobile"
## [21] "IT Software - Network Administration , Security"
## [22] "IT Software - Other"
## [23] "IT Software - QA & Testing"
## [24] "IT Software - System Programming"
## [25] "IT Software - Telecom Software"
## [26] "ITES , BPO , KPO , LPO , Customer Service , Operations"
## [27] "Journalism , Editing , Content"
## [28] "Legal , Regulatory , Intellectual Property"
## [29] "Marketing , Advertising , MR , PR , Media Planning"
## [30] "Medical , Healthcare , R&D , Pharmaceuticals , Biotechnology"
## [31] "Other"
## [32] "Other Employment Type: Full Time, Permanent"
## [33] "Production , Manufacturing , Maintenance"
## [34] "Purchase / Logistics / Supply Chain"
## [35] "Sales , Retail , Business Development"
## [36] "Site Engineering , Project Management"
## [37] "Strategy , Management Consulting , Corporate Planning"
## [38] "Supply Chain , Logistics , Purchase , Materials"
## [39] "Teaching , Education , Training , Counselling"
## [40] "Top Management"
## [41] "Travel , Tours , Ticketing , Airlines"
## [1] "----- Industry , num categorias: 54 -----"
## [1] ""
## [2] "Accounting / Finance"
## [3] "Accounting, Finance"
## [4] "Advertising, PR, MR, Event Management"
## [5] "Animation, Gaming"
## [6] "Architecture, Interior Design"
## [7] "Automobile, Auto Anciliary, Auto Components"
## [8] "Aviation, Aerospace, Aeronautical"
## [9] "Banking / Financial Services / Broking"
## [10] "Banking, Financial Services, Broking"
## [11] "BPO / Call Centre / ITES"
## [12] "BPO, Call Centre, ITeS"
## [13] "Chemicals, PetroChemical, Plastic, Rubber"
## [14] "Construction, Engineering, Cement, Metals"
## [15] "Consumer Electronics, Appliances, Durables"
## [16] "Courier, Transportation, Freight , Warehousing"
## [17] "Education / Teaching / Training"
## [18] "Education, Teaching, Training"
## [19] "Electricals, Switchgears"
## [20] "Export, Import"
## [21] "Facility Management"
## [22] "FMCG / Foods / Beverage"
## [23] "FMCG, Foods, Beverage"
## [24] "Fresher, Trainee, Entry Level"
## [25] "Government, Defence"
## [26] "Industrial Products, Heavy Machinery"
## [27] "Insurance"
## [28] "Internet, Ecommerce"
## [29] "Iron and Steel"
## [30] "IT-Hardware & Networking"
## [31] "IT-Software / Software Services"
## [32] "IT-Software, Software Services"
## [33] "KPO, Research, Analytics"
## [34] "Media, Entertainment, Internet"
## [35] "Medical, Healthcare, Hospitals"
## [36] "NGO, Social Services, Regulators, Industry Associations"
## [37] "Oil and Gas, Energy, Power, Infrastructure"
## [38] "Other"
## [39] "Pharma / Biotech / Clinical Research"
## [40] "Pharma, Biotech, Clinical Research"
## [41] "Printing, Packaging"
## [42] "Publishing"
## [43] "Real Estate, Property"
## [44] "Recruitment, Staffing"
## [45] "Retail, Wholesale"
## [46] "Security, Law Enforcement"
## [47] "Semiconductors, Electronics"
## [48] "Strategy / Management Consulting Firms"
## [49] "Strategy, Management Consulting Firms"
## [50] "Telcom, ISP"
## [51] "Telecom / ISP"
## [52] "Textiles, Garments, Accessories"
## [53] "Travel , Hotels , Restaurants , Airlines , Railways"
## [54] "Wellness , Fitness , Sports, Beauty"
## [1] "----- Role , num categorias: 139 -----"
## [1] ""
## [2] "Accounts Executive/Accountant"
## [3] "Accounts Manager"
## [4] "Analytics Manager"
## [5] "Architect"
## [6] "Area Sales Manager"
## [7] "Associate/Senior Associate -(NonTechnical)"
## [8] "Associate/Senior Associate -(Technical)"
## [9] "Branch Manager"
## [10] "Branch Manager/Regional Manager"
## [11] "Business Analyst"
## [12] "Business/EDP Analyst"
## [13] "Cashier"
## [14] "Centre Head / Branch Head / Club Manager"
## [15] "CEO/MD/Director"
## [16] "Client Servicing Executive"
## [17] "Client Servicing/Key Account Manager"
## [18] "Content Developer"
## [19] "Corporate Planning/Strategy Manager"
## [20] "Counter Sales"
## [21] "Creative Director"
## [22] "CSR Manager"
## [23] "Customer Support Engineer/Technician"
## [24] "Data Analyst"
## [25] "DaycareTeacher / Incharge / Attendant"
## [26] "DBA"
## [27] "Design Engineer"
## [28] "Design Engineer/Manager"
## [29] "Direct Marketing Executive"
## [30] "Documentation/Medical Writing"
## [31] "Draughtsman"
## [32] "Engineering Manager"
## [33] "Equipment installation, calibration, validation and maintenance. Maintain the master list for preventive maintenance and calibration of GLP AND NONGLP Instruments Preparing the IQ,OQ,PQ Documentation for new equipment during installation Attend and rectifying the CENTRIFUGE,CO2 INCUBATOR ,HPLC, CENTRIFUGE, CELLCOUNTER, HPLC, ROTAVAPORS, INCUBATORS, WATER PURIFICATION SYSTEMS, FPLC breakdown issues Attend and rectifying the HPLC breakdown issues Coordinating with Vendors, Projects team, Validation team and end-users for installation and qualification (IQ, OQ and PQ) of all the Biologics department equipment. Zero down time maintenance of all laboratory department equipment. Maintaining stock of equipment accessories, spares and consumables as per requirement. To assist, attend and Execute Preventive Maintenance/Breakdown Maintenance for Various Biology and Analytical equipment. Attend breakdown Maintenance calls and Perform routine Preventive Maintenance for Instruments like CENTRIFUGE, CELLCOUNTER, HPLC, ROTAVAPORS, INCUBATORS, WATER PURIFICATION SYSTEMS, HEATING STIRRERS, FLASH CHROMATOGRAPHY SYSTEMS AND VARIOUS BIO-ANALYTICAL INSTRUMENTS IN JUBILANT BIOSYS. Working with Scientists to ensure smooth running of the Equi Salary: Not Disclosed by Recruiter Industry: Pharma / Biotech / Clinical Research Functional Area: Other Employment Type: Full Time, Permanent"
## [34] "Equity Manager"
## [35] "ERP Consultant"
## [36] "Executive/ Sr Executive - Administration"
## [37] "Executive/Master Chef"
## [38] "Factory Head"
## [39] "Finance/Budgeting Manager"
## [40] "Financial Analyst"
## [41] "Fresher"
## [42] "Front Office/Guest Relations Executive/Manager"
## [43] "Functional Outside Consultant"
## [44] "Graphic Designer"
## [45] "Graphic/Web Designer"
## [46] "Head / VP/ GM/ National Manager After Sales"
## [47] "Head/VP/GM-CFO/Financial Controller"
## [48] "Head/VP/GM-Finance/Audit"
## [49] "Head/VP/GM-HR"
## [50] "Head/VP/GM-Operations"
## [51] "Head/VP/GM-Production/Manufacturing/Maintenance"
## [52] "Head/VP/GM-Recruitment"
## [53] "Head/VP/GM-Regulatory Affairs"
## [54] "Head/VP/GM-Technology(IT)/CTO"
## [55] "Head/VP/GM-Training & Development"
## [56] "Head/VP/GM/National Manager -Sales"
## [57] "Housekeeping Executive/Assistant."
## [58] "HR Executive"
## [59] "HR Manager"
## [60] "Intern"
## [61] "IT/Networking-Manager"
## [62] "Lecturer/Professor"
## [63] "Logistics Executive"
## [64] "Logistics Manager"
## [65] "Maintenance Engineer"
## [66] "Marketing Manager"
## [67] "Media Planning Executive/Manager"
## [68] "Medical Representative"
## [69] "Merchandiser"
## [70] "Nurse"
## [71] "Other"
## [72] "Outside Consultant"
## [73] "Outside Technical Consultant"
## [74] "Pay Roll/Compensation Manager"
## [75] "Pharmacist/Chemist/Bio Chemist"
## [76] "Physics Teacher"
## [77] "PPC /Pay Per Click Specialist"
## [78] "Pre Sales Consultant"
## [79] "Process Flow Analyst"
## [80] "Product/Brand Manager"
## [81] "Production Manager"
## [82] "Project Architect"
## [83] "Project Lead"
## [84] "Project Manager-IT/Software"
## [85] "Project Manager-Production/Manufacturing/Maintenance"
## [86] "Proof Reader"
## [87] "Public Relations & Media Relations Manager"
## [88] "Purchase Executive"
## [89] "Purchase/Vendor Development Manager"
## [90] "Quality Assurance/Quality Control Executive"
## [91] "Quality Assurance/Quality Control Manager"
## [92] "R&D Executive"
## [93] "Receptionist"
## [94] "Recruitment Executive"
## [95] "Regional Manager"
## [96] "Research Scientist"
## [97] "Restaurant Manager"
## [98] "Safety Officer/Manager"
## [99] "Sales / BD Manager"
## [100] "Sales Coordinator"
## [101] "Sales Executive / Officer"
## [102] "Sales Executive/Officer"
## [103] "Sales Officer"
## [104] "Sales Trainer"
## [105] "Sales/Business Development Manager"
## [106] "Search Engine Optimisation /SEO Specialist"
## [107] "Senior Design Engineer"
## [108] "Service/Maintenance Engineer"
## [109] "Social Media Marketing Manager"
## [110] "Software Developer"
## [111] "Solution Architect / Enterprise Architect"
## [112] "Stenographer/Data Entry Operator"
## [113] "Subject Matter Expert"
## [114] "Suguna Group was founded in the year 1984 with the inception of Suguna Foods in poultry sector by first generation entrepreneurs. Suguna is a USD 1.3 billion (INR 9,000 cr) group and leader in Indian protein food/animal farming industry. With an employee footprint of more than 8500, the group is in to poultry, dairy, processed protein food, animal nutrition, healthcare & biologicals. Group companies are Suguna Foods, Suguna Dairy, Globion, Aminovit Srilanka, Suguna Bangladesh and Kenya. Suguna Foods is the largest poultry enterprise in India and it ranks among the top 10 worldwide. The fully integrated operations cover broiler and layer farming, hatcheries, feed mills, processing plants, vaccines and exports. Suguna markets live broiler chicken, value added eggs, ready-to-eat and ready-to-cook chicken products. With the intent to provide consumers with fresh, clean and hygienic packed chicken, Suguna has set up a chain of modern retail outlets in the name of ‘Daily Fressh’. Suguna Foods pioneered contract farming in poultry industry, and now has presence in 21 states in India. Suguna as a brand is known for its quality products which has been well accepted by the consumers. Suguna Group always believes in energising rural India and providing nutritional security to India and is proud to associate with the mission of improving livelihood of 38,000 farmers"
## [115] "Surgeon"
## [116] "System Administrator"
## [117] "System Analyst"
## [118] "System Security"
## [119] "Team Lead/Technical Lead"
## [120] "Team Leader -(NonTechnical)"
## [121] "Technical / Process Trainer"
## [122] "Technical Architect"
## [123] "Technical Lead/Project Lead"
## [124] "Technical Support Engineer"
## [125] "Technical Support Manager"
## [126] "Technical Writer"
## [127] "Telecalling/Telemarketing Executive"
## [128] "Telesales/Telemarketing Executive/Officer"
## [129] "Testing Engineer"
## [130] "Tour Management Manager/Senior Manager"
## [131] "Trainee"
## [132] "Trainer"
## [133] "Training Manager"
## [134] "Visualiser"
## [135] "Voice & Accent Trainer"
## [136] "Web Designer"
## [137] "Webmaster"
## [138] "Workman/Foreman/Technician"
## [139] "ZS pioneers in sales force and marketing analytics applying optimization techniques to sales force and marketing investment problems. We have grown significantly and are now recognized global leaders in sales and marketing consulting. A key enabler of our services is leveraging data in delivering client solutions. The data available about customers across Healthcare and multiple industries is getting richer and the problems that our customers are trying to answer continue to evolve. In our endeavor to stay ahead of curve in providing solutions to these evolving complex business problems, ZS has set up a Data Scientist track which has following major focus areas: Research the evolving datasets and newer information sources to understand the possibilities Apply advanced analytical techniques and algorithms to improve current as well as develop cutting edge offerings/solutions Deliver client impact by collaboratively implementing and broad basing these solutions Provide thought leadership by developing the ZS Point of View in the industry The Manager position is the precursor to the Associate Principal and Principal Positions, and therefore part of the ZS leadership ladder. Every Manager leads one or more Spaces, i.e. business units focused either on a specific client, or a specific expertise area. Therefore ZS Data Science Managers are responsible for strong analytical expertise, knowledge and experience of various machine learning algorithms, tools & big data technologies, leveraging this knowledge for innovation, thought leadership, stakeholder relationship management, effectively coaching and responsible for people growth and defining-running-refining their space operating models, guided closely by Principals. Managers leverage their experience to take responsibility for providing analytical solutions across projects, deliver quality work for clients and lead client and ZS-leader relationships from beginning of their tenure. Provide expertise in architecting and implementing analytical solutions for projects Manage projects and assist in managing stakeholder relationships Direct multiple projects simultaneously, honing analytical and project management skills Motivate, coach and serve as a role model for space team members Provide thought leadership and innovation within projects and across practice areas Partner with onshore colleagues to develop new business with existing and new clients Develop and implement specific frameworks for strategy and programs Contribute to ZSs capability building and knowledge creation Coach, mentor, and conduct training programs Play an active role in India office growth related initiatives (e.g. recruiting, training, etc.). Required Candidate profile Managers have 8 - 12 years work experience in industry through consulting work or within an industry leader (a combination of experience is preferred) BE/ B.Tech / BS (stats) from Tier-1 institute would be required. PhD in Computer Science (OR Statistics) / M.Tech / MS from a premier institute would be highly preferred Substantial experience in Machine Learning Knowledge of big data/ advanced analytics concepts and algorithms text mining, social listening, recommender systems, predictive modeling, etc. Knowledge of programming Java/Python/R Exposure to tools/platforms Hadoop eco system and DB systems Agile project planning and project management skills Excellent communication skills In addition, we seek individuals with the following Desire to make a business impact for our clients Leadership experience Personal initiative and strong work ethic Self-motivation and detail orientation Organization & planning skills Communication skills Salary: Not Disclosed by Recruiter Industry: Strategy / Management Consulting Firms Functional Area: Other"
print(colnames(select_if(data,is.character)))
## [1] "Job.Title" "Job.Experience.Required"
## [3] "Key.Skills" "Role.Category"
## [5] "Location" "Functional.Area"
## [7] "Industry" "Role"
print(colnames(select_if(data,is.numeric)))
## [1] "Longitude" "Latitude" "sal"
Se observa que en el juego de datos hay 8 variables categóricas (Job.Title, Job.Experience.Required, Key.Skills, Role.Category, Location, Functional.Area, Industry, Role) y 3 numéricas (Longitude, Latitude, sal).
En la variable Job Experience Required se encuentran registros tanto del formato ‘<minExp> - <maxExp> yrs’ como ’ <minExp> - <maxExp> Years’. Para unificar estos datos, lo convertiremos todo al formato ‘<minExp>-<maxExp>’. Además, se encuentras registros ‘Not Mentioned’ y ‘vide’, los cuales supondremos que cualquier persona, con o sin experiencia, puede optar al puesto, y, por tanto, los reemplazaremos por ‘0-50’, ya que difícilmente una persona superará los 50 años de experiencia. Para ello, utilizaremos las funciones str_remove_all(), que elimina una subcadena de una cadena, para eliminar espacios; tolower(), que convierte cadenas de texto a minúscula, para no distinguir entre ‘y’ e ‘Y’; strsplit(), que divide una cadena por un delimitador definido, para separar la parte numérica (<minExp>-<maxExp>); lapply() para convertir lo recibido por strplit() en un lista; y, por último, str_replace_all(), que reemplaza una subcadena dentro de una cadena por otra subcadena, para reemplazar ‘Not Mentioned’ y ‘vide’ por ‘0-50’.
if(!require('stringr')) install.packages('stringr'); library('stringr')
experiencia = data$Job.Experience.Required
# Elimino espacios en blanco
experiencia = str_remove_all(experiencia, " ")
# Convierto todo a minúsculas para no diferenciar entre 'Y' e 'y'
experiencia = tolower(experiencia)
# Separo por 'y' y me quedo con el primer elemento.
# Por ejemplo: '3-5yrs' -> [3-5,rs] -> '3-5'
experiencia = lapply(strsplit(experiencia,split='y'),'[',1)
# Reemplazo 'vide' y 'notmentioned' por '0-50'
experiencia = str_replace_all(experiencia,'vide','0-50')
experiencia = str_replace_all(experiencia,'notmentioned','0-50')
# Actualizo el juego de datos
data$Job.Experience.Required <- experiencia
# Muestro categorías
print(paste("num categorias:", length(levels(factor(data$Job.Experience.Required)))))
## [1] "num categorias: 61"
print(levels(factor(data$Job.Experience.Required)))
## [1] "0-0" "0-1" "0-2" "0-3" "0-4" "0-5" "0-50" "1-2" "1-3"
## [10] "1-4" "1-5" "1-6" "10-12" "10-14" "10-15" "10-16" "10-17" "10-20"
## [19] "11-15" "12-15" "12-16" "12-17" "12-18" "12-22" "13-15" "15-18" "15-20"
## [28] "15-22" "17-27" "2-3" "2-4" "2-5" "2-6" "2-7" "20-26" "3-4"
## [37] "3-5" "3-6" "3-7" "3-8" "4-5" "4-6" "4-7" "4-8" "4-9"
## [46] "5-10" "5-7" "5-8" "5-9" "6-10" "6-11" "6-7" "6-8" "6-9"
## [55] "7-10" "7-12" "7-8" "8-10" "8-12" "8-13" "9-14"
De esta forma, se consigue unificar las 76 categorías anteriores en 61.
Vamos a desglosar este atributo en dos: ‘minExp’ y ‘maxExp’ para poder analizar por separado la experiencia mínima y máxima requerida para un trabajo, utilizando la función as.integer() para convertir los caracteres en enteros, teniendo así dos variables numéricas más.
data$minExp <- as.integer(lapply(strsplit(data$Job.Experience.Required,split='-'),'[',1))
data$maxExp <- as.integer(lapply(strsplit(data$Job.Experience.Required,split='-'),'[',2))
A continuación, vamos a crear histogramas y describir los valores para ver los datos en general de las variables numéricas para hacer una primera aproximación a los datos. Además, defino una función mode() que devuelve la moda (valor más repetido) en una lista. Para ello, utilizo la función table()para crear una tabla de frecuencias
if(!require('ggplot2')) install.packages('ggplot2'); library('ggplot2')
if(!require('Rmisc')) install.packages('Rmisc'); library('Rmisc')
if(!require('xfun')) install.packages('xfun'); library('xfun')
summary(data$Longitude)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## -79.03 73.85 77.12 75.99 77.59 121.10 27
ggp <- ggplot(data, aes_string(x = "Longitude")) +
geom_histogram(bins = 30, fill = "cornflowerblue", color = "black",ggtittle ="Contador ocurrencias")
plot(ggp)
summary(data$Latitude)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## -8.124 17.361 19.076 21.090 28.428 46.314 27
ggp <- ggplot(data, aes_string(x = "Latitude")) +
geom_histogram(bins = 30, fill = "cornflowerblue", color = "black",ggtittle ="Contador ocurrencias")
plot(ggp)
summary(data$sal)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1510 2864 4213 4225 5623 6991
ggp <- ggplot(data, aes_string(x = "sal")) +
geom_histogram(bins = 30, fill = "cornflowerblue", color = "black",ggtittle ="Contador ocurrencias")
plot(ggp)
summary(data$minExp)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 1.000 2.000 3.358 5.000 20.000
ggp <- ggplot(data, aes_string(x = "minExp")) +
geom_histogram(bins = 30, fill = "cornflowerblue", color = "black",ggtittle ="Contador ocurrencias")
plot(ggp)
summary(data$maxExp)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 4.000 6.000 7.996 9.000 50.000
ggp <- ggplot(data, aes_string(x = "maxExp")) +
geom_histogram(bins = 30, fill = "cornflowerblue", color = "black",ggtittle ="Contador ocurrencias")
plot(ggp)
A continuación, pintamos y mostramos las coordenadas en un mapa para visualizarlas. Para ello, utilizamos la función map_data() para obtener la imagen del mapa del mundo y geom_polygon() para pintar dicho mapa. Posteriormente, utilizamos geom_point() para pintar las coordenadas sobre el mapa.
if(!require('mapdata')) install.packages('mapdata'); library(mapdata)
if(!require('maps')) install.packages('maps'); library(maps)
if(!require('ggrepel')) install.packages('ggrepel'); library(ggrepel)
if(!require('tidyverse')) install.packages('tidyverse'); library(tidyverse)
# Guardamos la información en un nuevo dataframe llamado mapa_mundo
mapa_mundo <- map_data("world")
# Visualizar el mapa y las coordenadas
mapa_mundo %>%
ggplot() +
geom_polygon(aes( x= long, y = lat, group = group),
fill = "white",
color = "black") +
geom_point(data=data, aes(Longitude, Latitude),
color= "red", size=1)
Vemos que la mayoría de trabajos pertenecen a la India.
A continuación, vamos a comprobar la existencia de valores atípicos mediante diagramas de cajas. Un diagrama de cajas muestran a simple vista la mediana y los cuartiles de los datos, y también pueden representarse sus valores atípicos. Para ello, primero debo convertir las variables categóricas en numéricas.
data$numeric.Job.Title = as.numeric(factor(data$Job.Title))
data$numeric.Key.Skills = as.numeric(factor(data$Key.Skills))
data$numeric.Role.Category = as.numeric(factor(data$Role.Category))
data$numeric.Location = as.numeric(factor(data$Location))
data$numeric.Functional.Area = as.numeric(factor(data$Functional.Area))
data$numeric.Industry = as.numeric(factor(data$Industry))
data$numeric.Role = as.numeric(factor(data$Role))
# Guardamos en una
dataAux= data %>% select(colnames(select_if(data,is.numeric)))
Utilizamoss la función boxplot() para mostrar gráficamente el diagrama de barras.
for(i in colnames(dataAux)){
boxplot(dataAux[i],main=i, col="gray")
}
Se observa en los atributos Longitude, Latitude, minExp, maxExp y numeric.Industry la aparición de valores atípicos. Para evitar el exceso de protagonismo de estos datos extremos, los reemplazamos por la media windsor (fuente: https://proyectodescartes.org/iCartesiLibri/materiales_didacticos/IntroduccionEstadisticaProbabilidad/3ESO/5_1MediaAritmetica/index.html#:~:text=Media%20o%20promedio%20Windsor,inferior%20por%20sus%20inmediatos%20anteriores).
La media windsor es una variante de la media aritmética que se suele utilizar para evitar el excesivo protagonismo de los datos extremos. Consiste en sustituir los datos extremos superior e inferior por sus inmediatos anteriores. Posteriormente se calcula la media aritmética de todos los datos así actualizados. Para ello, utilizamos la función winsor.mean() de la librería psych.
En el caso de numeric.Industry, los valores extremos están muy cercanos a los cuartiles, por lo que no modificaremos nada en esta variable. En Longitude y Latitudereemplazaremos los valores fuera de los rango [50,85] y [0,40], respectivamente. En el caso de minExp y maxExp, no será posible corregir todos los valores atípicos, ya que a medida que unos se van corrigiendo, la media aritmética se va actualizando y van surgiendo nuevos valores atípicos. Por lo tanto, corregiremos únicamente los valores superiores a 15 y a 25, respectivamente.
if(!require("psych")) install.packages("psych"); library(psych)
# Reemplazo extremos de 'Longitude'
dataAux$Longitude[which(dataAux$Longitude < 50 | dataAux$Longitude > 85)] <- winsor.mean(dataAux$Longitude)
# Reemplazo extremos de 'Latitude'
dataAux$Latitude[which(dataAux$Latitude < 0 | dataAux$Latitude > 40)] <- winsor.mean(dataAux$Latitude)
# Reemplazo extremos de 'minExp'
dataAux$minExp[which(dataAux$minExp > 15)] <- winsor.mean(dataAux$minExp)
# Reemplazo extremos de 'maxExp'
dataAux$maxExp[which(dataAux$maxExp > 25)] <- winsor.mean(dataAux$maxExp)
for(i in colnames(dataAux)){
boxplot(dataAux[i],main=i, col="gray")
}
Una vez limpiados los datos, vamos a buscar las correlaciones en función del salario y el resto de variables, visualizando cómo evoluciona el salario en función de cada variable. Para ello, utilizamos la función geom_smooth() que permite dibujar una línea de regresión en un gráfico de dispersión, lo que puede ayudar a mostrar la tendencia general de los datos y a hacer predicciones sobre el comportamiento futuro de los mismos.
histList<- vector('list', ncol(dataAux))
for(i in seq_along(dataAux)){
message(i)
histList[[i]]<-local({
i<-i
x <-log(dataAux[[i]])
ggp<- ggplot(data = dataAux, aes(x = x, y=data$sal)) +
geom_point(color = "gray30") + geom_smooth(method = lm,color = "firebrick") +
theme_bw() + xlab(names(dataAux)[i]) + ylab("Sal")
})
}
multiplot(plotlist = histList, cols = 3)
A priori no se aprecia ninguna tendencia clara. Para ver si existe alguna correlación entre variables, utilizamos la función cor(), una función estadística que se utiliza para calcular la correlación entre dos variables. La correlación es una medida que indica el grado en el que dos variables están relacionadas entre sí, y puede ser positiva (si las variables aumentan o disminuyen juntas) o negativa (si una variable aumenta cuando la otra disminuye). Posteriormente, utilizamos corrplot() para representar gráficamente dicha correlación.
if(!require("corrplot")) install.packages("corrplot"); library(corrplot)
# Correlaciono variables numéricas
res <- cor(dataAux)
# Reemplazo valores nulos por 0
res[is.na(res)]<-0
# Muestro correlacion
corrplot(res,method="color",tl.col="black", tl.srt=30, order = "AOE",
number.cex=0.75,sig.level = 0.01, addCoef.col = "black")
Aquí podemos apreciar que no existe prácticamente correlación entre las variables. Sin embargo, es importante tener en cuenta que la ausencia de correlación entre las variables no necesariamente implica que no exista una relación entre ellas. Por ejemplo, es posible que dos variables estén relacionadas de manera no lineal, lo que puede dificultar la detección de una correlación mediante un análisis estadístico simple. En estos casos, es posible que sea necesario utilizar técnicas de análisis más avanzadas para detectar y modelar la relación entre las variables, y así generar un buen modelo de predicción.
En resumen, es posible generar un buen modelo de predicción con variables que no tienen correlación entre sí, pero esto puede requerir una mayor cantidad de datos y un análisis más detallado. Si las variables están relacionadas de manera no lineal, puede ser necesario utilizar técnicas de análisis más avanzadas para detectar y modelar esta relación.
Aplicamos factanal() (fuente: https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/factanal) , una función que permite realizar el análisis factorial. Este es un método de reducción de dimensionalidad que se utiliza para extraer los factores o características más importantes que determinan un conjunto de datos.
Por ejemplo, si tenemos un conjunto de datos que contiene las respuestas de diferentes personas a un cuestionario sobre sus hábitos alimenticios, podemos utilizar la función factanal(), para extraer los factores que determinan estos hábitos. Esto nos permitiría reducir el conjunto de datos a un número más reducido de factores y así facilitar su análisis y visualización.
En este caso, probaremos con, por ejemplo, 3 factores:
# Realizar el análisis factorial
factores <- factanal(na.omit(dataAux), factors=3)
# Mostrar el resultado del análisis
print(summary(factores))
## Length Class Mode
## converged 1 -none- logical
## loadings 36 loadings numeric
## uniquenesses 12 -none- numeric
## correlation 144 -none- numeric
## criteria 3 -none- numeric
## factors 1 -none- numeric
## dof 1 -none- numeric
## method 1 -none- character
## rotmat 9 -none- numeric
## STATISTIC 1 -none- numeric
## PVAL 1 -none- numeric
## n.obs 1 -none- numeric
## call 3 -none- call
print(factores)
##
## Call:
## factanal(x = na.omit(dataAux), factors = 3)
##
## Uniquenesses:
## Longitude Latitude sal
## 0.879 0.874 0.996
## minExp maxExp numeric.Job.Title
## 0.125 0.005 0.778
## numeric.Key.Skills numeric.Role.Category numeric.Location
## 0.965 0.884 0.226
## numeric.Functional.Area numeric.Industry numeric.Role
## 0.876 0.891 0.696
##
## Loadings:
## Factor1 Factor2 Factor3
## Longitude -0.333
## Latitude 0.338
## sal
## minExp 0.918 0.176
## maxExp 0.992
## numeric.Job.Title -0.162 0.443
## numeric.Key.Skills -0.163
## numeric.Role.Category 0.338
## numeric.Location 0.865 0.157
## numeric.Functional.Area 0.351
## numeric.Industry 0.319
## numeric.Role -0.126 0.535
##
## Factor1 Factor2 Factor3
## SS loadings 1.847 1.062 0.897
## Proportion Var 0.154 0.088 0.075
## Cumulative Var 0.154 0.242 0.317
##
## Test of the hypothesis that 3 factors are sufficient.
## The chi square statistic is 97.29 on 33 degrees of freedom.
## The p-value is 2.94e-08
El resultado obtenido por la función factanal(), se puede interpretar de la siguiente manera:
Uniquenesses: muestra la cantidad de factores que se han extraído del conjunto de datos y la suma de los cuadrados residuales para cada uno de estos factores. Esta información nos permite comparar diferentes modelos de factores y elegir el que mejor se ajusta a los datos.
Loadings: muestra la matriz de cargas factoriales, que indica el grado en el que cada variable contribuye a cada uno de los factores extraídos. Esta información nos permite identificar qué variables son las más importantes para cada factor y cómo se relacionan entre sí.
La tercera parte del resultado muestra la matriz de correlaciones factoriales, que indica el grado en el que cada variable está correlacionada con cada uno de los factores extraídos. Esta información nos permite ver cuáles de las variables originales están más relacionadas con cada factor y cómo se relacionan entre sí.
Finalmente, muestra un análisis estadístico de que el número de factores elegido sea o no suficiente para tener una muestra representativa del conjunto de datos. En un análisis factorial, el valor de chi square y el p-value se obtienen a partir del test de esfericidad de Bartlett, que se utiliza para verificar si las variables del conjunto de datos están relacionadas entre sí de manera significativa.
El valor de chi square indica el grado en el que las variables del conjunto de datos están relacionadas entre sí. Cuanto mayor sea el valor de chi square, más relacionadas estarán las variables entre sí y más adecuado será el análisis factorial para describir la variabilidad total de los datos.
El p-value indica la probabilidad de que las variables del conjunto de datos estén relacionadas entre sí de manera aleatoria. Cuanto más pequeño sea el p-value, más significativa será la relación entre las variables y más adecuado será el análisis factorial para describir la variabilidad total de los datos.
Por lo tanto, para interpretar los valores de chi square y p-value obtenidos en un análisis factorial, es importante tener en cuenta que:
Si el valor de chi square es grande y el p-value es pequeño, esto indica que las variables del conjunto de datos están altamente relacionadas entre sí y que el análisis factorial es una buena opción para describir la variabilidad total de los datos.
Si el valor de chi square es pequeño y el p-value es grande, esto indica que las variables del conjunto de datos no están muy relacionadas entre sí y que el análisis factorial puede no ser la mejor opción para describir la variabilidad total de los datos. En este caso, es posible que sea necesario utilizar otro método de análisis.
En resumen, el resultado de factanal() nos permite comparar diferentes modelos de factores, identificar qué variables son las más importantes para cada factor y ver cuáles de las variables originales están más relacionadas con cada factor. En este caso, se obtiene que las mejores variables para cada factor son maxExp, numeric.Location y numeric.Role, respectivamente. Además, el valor de chi square es grande y el p-value es pequeño, por lo que estas variables están bien relacionadas entre sí y el análisis factorial es una buena opción para describir la variabilidad total de los datos.
Otra alternativa es usar princomp() (fuente: https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/princomp), una función que permite realizar el análisis de componentes principales. Este es un método de reducción de dimensionalidad que se utiliza para encontrar las dimensiones o características principales que explican la mayor cantidad de variabilidad en un conjunto de datos.
Por ejemplo, si tenemos un conjunto de datos que contiene las calificaciones de diferentes estudiantes en diferentes materias, podemos utilizar la función princomp() para encontrar las dimensiones principales que explican la mayor cantidad de variabilidad en los datos. Esto nos permitiría reducir el conjunto de datos a un número más reducido de dimensiones y así facilitar su análisis y visualización.
Princomp solo se puede utilizar para análisis de componentes principales, mientras que factanal permite realizar tanto análisis de componentes principales como análisis factorial. En general, ambos métodos son útiles para reducir la dimensionalidad de los datos y encontrar patrones en ellos, pero dependiendo de las necesidades y del tipo de datos, uno puede ser más adecuado que el otro.
# Realizar el análisis de componentes principales
pca <- princomp(na.omit(dataAux))
# Mostrar el resultado del análisis
summary(pca)
## Importance of components:
## Comp.1 Comp.2 Comp.3 Comp.4
## Standard deviation 1606.3903599 1.524261e+02 1.283301e+02 4.061432e+01
## Proportion of Variance 0.9835916 8.855874e-03 6.277257e-03 6.287399e-04
## Cumulative Proportion 0.9835916 9.924475e-01 9.987248e-01 9.993535e-01
## Comp.5 Comp.6 Comp.7 Comp.8
## Standard deviation 3.265922e+01 1.806960e+01 1.209374e+01 9.862835e+00
## Proportion of Variance 4.065597e-04 1.244543e-04 5.574858e-05 3.707799e-05
## Cumulative Proportion 9.997601e-01 9.998845e-01 9.999403e-01 9.999774e-01
## Comp.9 Comp.10 Comp.11 Comp.12
## Standard deviation 5.558240e+00 4.849515e+00 2.038189e+00 9.167388e-01
## Proportion of Variance 1.177571e-05 8.964154e-06 1.583439e-06 3.203346e-07
## Cumulative Proportion 9.999891e-01 9.999981e-01 9.999997e-01 1.000000e+00
# Acceder a los pesos de las variables originales
print(pca$loadings)
##
## Loadings:
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8
## Longitude
## Latitude
## sal -1.000
## minExp
## maxExp
## numeric.Job.Title 0.677 0.728 -0.109
## numeric.Key.Skills 0.734 -0.677
## numeric.Role.Category 0.972 0.219
## numeric.Location -0.994
## numeric.Functional.Area 0.205 0.153 -0.964
## numeric.Industry -0.984 -0.136
## numeric.Role 0.106 0.991
## Comp.9 Comp.10 Comp.11 Comp.12
## Longitude 1.000
## Latitude 0.905 -0.419
## sal
## minExp -0.269 -0.555 -0.787
## maxExp -0.324 -0.718 0.617
## numeric.Job.Title
## numeric.Key.Skills
## numeric.Role.Category
## numeric.Location
## numeric.Functional.Area
## numeric.Industry
## numeric.Role
##
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8 Comp.9
## SS loadings 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
## Proportion Var 0.083 0.083 0.083 0.083 0.083 0.083 0.083 0.083 0.083
## Cumulative Var 0.083 0.167 0.250 0.333 0.417 0.500 0.583 0.667 0.750
## Comp.10 Comp.11 Comp.12
## SS loadings 1.000 1.000 1.000
## Proportion Var 0.083 0.083 0.083
## Cumulative Var 0.833 0.917 1.000
# Acceder a los factores principales
print(summary(pca$scores))
## Comp.1 Comp.2 Comp.3 Comp.4
## Min. :-2752.49 Min. :-335.845 Min. :-331.299 Min. :-96.037
## 1st Qu.:-1434.68 1st Qu.:-114.080 1st Qu.: -77.323 1st Qu.:-38.475
## Median : -26.55 Median : 3.141 Median : 3.101 Median : 9.708
## Mean : 0.00 Mean : 0.000 Mean : 0.000 Mean : 0.000
## 3rd Qu.: 1381.99 3rd Qu.: 102.694 3rd Qu.: 85.569 3rd Qu.: 32.596
## Max. : 2727.79 Max. : 333.524 Max. : 309.793 Max. : 81.174
## Comp.5 Comp.6 Comp.7 Comp.8
## Min. :-49.86 Min. :-39.403 Min. :-31.252 Min. :-31.569
## 1st Qu.:-26.49 1st Qu.:-13.255 1st Qu.: -7.013 1st Qu.: -8.962
## Median :-13.89 Median : 2.473 Median : -1.497 Median : 1.829
## Mean : 0.00 Mean : 0.000 Mean : 0.000 Mean : 0.000
## 3rd Qu.: 34.52 3rd Qu.: 13.127 3rd Qu.: 7.521 3rd Qu.: 8.229
## Max. : 57.20 Max. : 39.622 Max. : 29.488 Max. : 23.766
## Comp.9 Comp.10 Comp.11 Comp.12
## Min. :-14.473 Min. :-19.1824 Min. :-4.8978 Min. :-2.91711
## 1st Qu.: -4.092 1st Qu.: -2.2040 1st Qu.:-1.6603 1st Qu.:-0.64922
## Median : -1.758 Median : 0.7318 Median : 0.5598 Median : 0.05298
## Mean : 0.000 Mean : 0.0000 Mean : 0.0000 Mean : 0.00000
## 3rd Qu.: 5.444 3rd Qu.: 3.2384 3rd Qu.: 1.2344 3rd Qu.: 0.68062
## Max. : 12.202 Max. : 9.9207 Max. : 4.3288 Max. : 2.87316
El resultado de princomp incluye varios elementos, como la varianza explicada por cada componente principal, los factores principales y los pesos de las variables originales en cada componente principal. Puedes usar esta información para entender qué variables son más importantes en tus datos y cómo están relacionadas entre sí.
La varianza explicada por cada componente principal mide cuánto de la variabilidad total de los datos se explica por cada componente principal, es decir, cuánto aporta cada componente al análisis. Podemos interpretarla de la siguiente manera:
Si la varianza explicada por un componente principal es cero, significa que este componente no aporta nada al análisis y puede ser eliminado.
Si la varianza explicada por un componente principal es pequeña, significa que este componente solo aporta una pequeña parte de la variabilidad total de los datos y puede tener poco impacto en el análisis.
Si la varianza explicada por un componente principal es grande, significa que este componente aporta mucho a la variabilidad total de los datos y puede ser muy importante en el análisis.
Así, observamos que las componentes Comp.1 (especialmente), Comp.2 y Comp.3 aportan mucho a la variabilidad total de los datos y puede ser muy importante en el análisis, mientras que el resto aportan una variabilidad menor, teniendo menos impacto en el análisis.
Los factores principales son las variables reducidas que se obtienen como resultado del análisis de componentes principales. Estos factores son una combinación lineal de las variables originales y se utilizan para resumir la información de los datos en un número más pequeño de variables.
Los pesos de las variables originales en cada componente principal indican qué tanto contribuye cada variable al factor principal correspondiente. Por lo general, las variables con pesos más altos son las que tienen más impacto en el factor principal y son las más importantes en el análisis.
Por lo tanto, los factores principales y los pesos de las variables originales te permiten entender qué variables son más importantes en tus datos y cómo están relacionadas entre sí. Esta información puede ser útil para interpretar los resultados del análisis y tomar decisiones en función de ellos. En este caso, se obtienen 3 variables principales: sal (inversamente correlacionada con el componente Comp.1), numeric.Key.Skills (Comp.2)y numeric.Job.Title (Comp.3).
Los datos estudiados tienen información a cerca de puestos de trabajo. Cada registro viene identificado por un título no único y una serie de atributos como los años de experiencia requerida, habilidades principales, localización, área funcional, rol, categoría del rol, industria, longitud, latitud y salario, además de una variable vacía que ha sido eliminada.
Se ha tratado de buscar alguna relación entre el salario y el resto de variables mediante una línea de regresión en un gráfico de dispersión, pero no se ha visto ninguna tendencia clara, por lo que, posteriormente, se ha calculado la correlación entre todas las variables, y, efectivamente, no había practicamente ninguna relación lineal entre variables. Llegados a este punto, se han aplicado dos procesos para reducir la dimensionalidad y obtener las variables más relevante.
En este caso, es importante tener en cuenta que el análisis de componentes principales (PCA) y el análisis factorial son dos técnicas diferentes que se utilizan para analizar conjuntos de datos y reducir su dimensionalidad. Ambos métodos tienen sus propios supuestos y criterios para determinar qué variables son importantes en el conjunto de datos, por lo que es normal que obtengan diferentes resultados.
En el caso de PCA, los 3 componentes principales que se han obtenido son salario, habilidades principales y título del trabajo. Esto indica que estas 3 variables tienen una alta correlación entre sí y, por lo tanto, contribuyen de manera significativa a la varianza en los datos. Esto puede deberse a que estas 3 variables estén altamente relacionadas con el rendimiento laboral, por ejemplo, un salario alto podría estar relacionado con habilidades principales más avanzadas y un título universitario.
Por otro lado, el análisis factorial ha determinado que las variables más importantes son experiencia máxima requerida, localización y rol. Esto sugiere que estas 3 variables también tienen una alta correlación entre sí y contribuyen de manera significativa a la varianza en los datos. Sin embargo, es posible que estas variables estén relacionadas de manera diferente a las determinadas por el PCA, por lo que es importante analizarlas de manera individual para comprender su importancia en el conjunto de datos.
En resumen, el análisis de componentes principales y el análisis factorial han identificado diferentes variables como importantes en el conjunto de datos, pero ambos métodos apuntan a que hay una alta correlación entre las variables seleccionadas. Por lo tanto, es importante analizar cada una de estas variables de manera individual para comprender su contribución a la varianza en los datos y su relación con el rendimiento laboral.
En esta práctica, continuaremos el estudio iniciado en la Práctica 1, donde abordamos un caso real de minería de datos. Utilizaremos el conjunto de datos preparado en esa primera actividad con el fin de extraer conocimiento y dar respuesta a la pregunta o problema definido, aplicando los algoritmos de clustering, regresión o clasificación necesarios para ello. Además, evaluaremos el desempeño de los distintos modelos y seleccionaremos el más adecuado al problema en cuestión.
En esta práctica se utilizarán los modelos vistos durante este semestre. Aplicaremos un modelo no supervisado basado en el concepto de distancia al conjunto de datos preparado, donde interpretarán los resultados obtenidos, y se repetirá el modelo usando una métrica de distancia diferente, con la que compararemos resultados. Además, aplicaremos los algoritmos DBSCAN y OPTICS, probando con diferentes valores de eps y interpretando y comparando los resultados con los métodos anteriores.
Posteriormente, aplicaremos un modelo de generación de reglas a partir de árboles de decisión, ajustando las diferentes opciones de creación, con y sin opciones de poda o boosting e interpretaremos y compararemos los resultados.
Finalmente, aplicaremos un modelo supervisado diferente al anterior, a elegir de los vistos en el material docente. Interpretaremos y compararemos el resultado con el modelo generado anterior. Tambien se Identificarán las eventuales limitaciones del dataset seleccionado y analizarán los riesgos para el caso de uso.
Una vez analizados y preprocesado los datos, podemos empezar a generar nuestros modelos. En este apartado, generaremos un modelo no supervisado utilizando el algoritmo k-means para agrupar los datos.
El algoritmo k-means es un algoritmo de clasificación no supervisada que requiere que de antemano se fijen los k grupos que quieren obtenerse.
Supongamos un juego de datos X = {x1, x2, …, xn} donde cada xi podría ser una observación con m atributos xi = {xi1, xi2 , …, xim}. Para clasificar nuestro juego de datos X, el algoritmo k-means sigue los siguientes pasos:
De entre las n observaciones selecciona k, al que llamaremos semillas, y denotaremos por cj donde j = 1,...,k. Cada semilla cj identificará su clúster Cj.
Asigna la observación xi al clúster Ct cuando la distancia entre la observación xi y la semilla ct sea la menor entre todas las semillas. d(xi,ct ) = min{d(xi,cj )}, j = 1, …, k.
Calcula los nuevos centroides a partir de las medias de los clústeres actuales.
Como criterio de parada, calcula la mejora que se produciría si asignáramos una observación a un clúster al que no pertenece actualmente. Entendiendo por mejora, por ejemplo, la minimización de la distancia de las distintas observaciones a sus respectivos centros
Realiza el cambio que mayor mejora proporciona.
Repite los pasos 3, 4 y 5 hasta que ningún cambio sea capaz de proporcionar una mejora significativa.
Para generar el modelo, primero debemos analizar las medidas de calidad del modelo para cada valor de k, y poder seleccionar así un valor de k óptimo:
Para implementarlo, en primer lugar utilizamos la función daisy() para calcular todas las diferencias por pares (distancias) entre observaciones en el conjunto de datos. Posteriormente, aplicamos k-medias con distintos valores para k y calculamos el valor promedio de la silueta en cada caso, entendiendo la silueta como la evaluación de cómo de bien o mal está clasificada la muestra en el clúster al que ha sido asignada. Para ello se usa una fórmula que tiene en cuenta la distancia a las muestras de su clúster y la distancia a las muestras del clúster vecino más cercano. Probaremos con valores de k entre 2 y 10, ya que
if (!require('cluster')) install.packages('cluster'); library(cluster)
## Loading required package: cluster
##
## Attaching package: 'cluster'
## The following object is masked from 'package:maps':
##
## votes.repub
# Como vamos a trabajar con los datos almacenados en dataAux tras el preprocesado
# Vamos a pasar estos datos a data para una mayor comodidad
data <- dataAux
# Eliminamos valores nulos que hayan podido quedar tras el preprocesado
data <- na.omit(data)
# Ya que se trata de un modelo no supervisado, vamos a eliminar la columna de las etiquetas 'sal'
data <- select(data, -sal)
# Calculo disimilaridad de los datos
d <- daisy(data)
# Calculo la silueta para cada valor de k
resultados <- rep(0, 10)
for (i in c(2,3,4,5,6,7,8,9,10))
{
fit <- kmeans(data, i)
y_cluster <- fit$cluster
sk <- silhouette(y_cluster, d)
resultados[i] <- mean(sk[,3])
}
Mostramos en un gráfica los valores de las siluetas media de cada prueba para comprobar que número de clústers es el mejor.
# Gráfica con la evolución del valor promedio de la silueta en función de k
plot(2:10,resultados[2:10],type="o",col="blue",pch=0,xlab="Número de clusters",ylab="Silueta")
Como era de esperar, la mejora más significativa se obtiene para valores de k distinto al número de posibles resultados de salario, ya que este número de posibles salarios es muy elevado y es complicado dar con ese valor exacto, que, además, podría estar restringiendo el modelo a la entrada de nuevos valores. En este caso se obtiene que la mejora más significativa se produce con k=3, lo cual sería interesante plantear como 3 rangos o franjas de salario.
Otra forma de evaluar cual es el mejor número de clústers es considerar el mejor modelo, aquel que ofrece la menor suma de los cuadrados de las distancias de los puntos de cada grupo con respecto a su centro (withinss), con la mayor separación entre centros de grupos (betweenss). Como se puede comprobar es una idea conceptualmente similar a la silueta. Una manera común de hacer la selección del número de clústers consiste en aplicar el método elbow (codo), que no es más que la selección del número de clústers en base a la inspección de la gráfica que se obtiene al iterar con el mismo conjunto de datos para distintos valores del número de clústers. Se seleccionará el valor que se encuentra en el “codo” de la curva.
# Calculo la suma de los cuadrados de las distancias de los puntos de cada
# grupo respecto de su centro para cada valor de k
resultados <- rep(0, 10)
for (i in c(2,3,4,5,6,7,8,9,10))
{
fit <- kmeans(data, i)
resultados[i] <- fit$tot.withinss
}
plot(2:10,resultados[2:10],type="o",col="blue",pch=0,xlab="Número de clusters",ylab="tot.tot.withinss")
En este caso el número óptimo de clústers son 4 que es cuando la curva comienza a estabilizarse, el cual tiene también un alto valor de silueta.
También se puede usar la función kmeansruns del paquete fpc que ejecuta el algoritmo kmeans con un conjunto de valores, para después seleccionar el valor del número de clústers que mejor funcione de acuerdo a dos criterios: la silueta media (“ASW”) y Calinski-Harabasz (“CH”).
La silueta media, también conocida como “average silhouette width” (ASW), es una medida de cómo similares son los puntos de datos dentro de un cluster en comparación con los puntos de datos en otros clusters. El valor de la silueta media varía entre -1 y 1, donde un valor cercano a 1 indica una alta similitud entre los puntos de datos dentro del mismo cluster y una baja similitud entre los puntos de datos de diferentes clusters. Un valor cercano a -1 indica que los puntos de datos de un cluster son más similares a los de otro cluster diferente al que esta asignado.
El coeficiente de Calinski-Harabasz, también conocido como “Calinski-Harabasz index” (CH), es una medida de la relación entre la varianza dentro de los clusters y la varianza entre los clusters. Este coeficiente se calcula como el ratio entre la varianza total del conjunto de datos y la varianza promedio dentro de los clusters. El valor de CH tiende a aumentar a medida que se mejora la calidad de la agrupación, es decir, cuando hay una mayor diferencia entre los grupos y menor variabilidad dentro de los mismos.
Es importante señalar que no existe una medida única que sea considerada como la mejor para evaluar el rendimiento de un agrupamiento, y la elección de una medida puede depender del problema específico y de las preferencias del usuario.
if (!require('fpc')) install.packages('fpc'); library(fpc)
## Loading required package: fpc
# Criterio de la silueta media para cada valor de k
fit_ch <- kmeansruns(data, krange = 1:10, criterion = "ch")
# Criterio de Calinski-Harabasz para cada valor de k
fit_asw <- kmeansruns(data, krange = 1:10, criterion = "asw")
Podemos comprobar el valor con el que se ha obtenido el mejor resultado.
# Muestro resultados
fit_ch$bestk
## [1] 4
fit_asw$bestk
## [1] 3
Observemos como la primera recomendación es de 4 clústers mientras que la segunda es de 3, coincidiendo con las obtenidas anteriormente.
Una buena estrategia es ver que pasa para diferentes valores de k utilizando los dos criterios.
# Muestro la evolución del valor de la silueta media en función de k
plot(1:10,fit_ch$crit,type="o",col="blue",pch=0,xlab="Número de clústers",ylab="Criterio Calinski-Harabasz")
# Muestro la evolución del valor de Calinski-Harabasz en función de k
plot(1:10,fit_asw$crit,type="o",col="blue",pch=0,xlab="Número de clústers",ylab="Criterio silueta media")
Los resultados coinciden los que hemos obtenido anteriormente. Con el criterio de la silueta media se obtienen 3 clústers y con el Calinski-Harabasz se obtienen 4.
Como se ha comprobado, conocer el número óptimo de clústers no es un problema fácil. Tampoco lo es la evaluación de los modelos de agregación.
Ya que no sabemos de antemano cuál es el valor real de k y tras este estudio parecen válidos valores de k tanto 3 como 4, vamos a ver cómo se ha comportado kmeans en el caso de pedirle 3 y 4 clústers. Para eso comparamos visualmente los campos dos a dos, con el valor real que sabemos está almacenado en el campo “sal” del dataset original.
Además, en cuanto a los valores obtenidos por las medidas de calidad, para ambos valores de k se obtiene un valor de silueta media cercano a 0.35, bastante lejos de los valores cercanos a 1 que se buscan, por lo que el modelo no será muy preciso.
K = 3
# Aplico k-means para k=3
data3clusters <- kmeans(data, 3)
# Muestro clasificación obtenida por k-means
plot(data, col=data3clusters$cluster, main="Clasificación k-means")
# Muestro clasificación real
plot(data, col=as.factor(dataAux$sal), main="Clasificación real")
Como podemos apreciar, el número de clústers no coincide, ya que, como hemos mencionado anteriormente, el número de posibles valores de salario es muy elevado, lo cual sería más adecuado para un problema de regresión. Sin embargo, podemos convertirlo en un problema de clasificación discretizando la variable objetivo. En este caso, la discretizaremos a 3 valores, para ello, vamos a calcular los cuantiles 33 y 66 que marcarán los límites de los rangos de salario. Utilizaremos la función quantile() para obtener dichos límites:
quantile_33 <- quantile(dataAux$sal, 0.33)
quantile_66 <- quantile(dataAux$sal, 0.66)
print(quantile_33)
## 33%
## 3250.68
print(quantile_66)
## 66%
## 5164.72
Obtenemos que, los límites para dividir los salarios en 3 grupos del mismo tamaño son 3251 y 5165 (redondeamos al entero más cercano).
# Discretizo "sal"
data$sal3clusters <- cut(na.omit(dataAux)$sal, c(0,3251,5165,Inf), labels=c("0-3251", "3252-5164", ">5164"))
# La almaceno en otra variable para no tener que recalcularlo posteriormente en el nuevo modelo
sal3clusters <- data$sal3clusters
summary(data$sal3clusters)
## 0-3251 3252-5164 >5164
## 156 152 165
Vemos que los datos se logran distribuir de forma equilibrada. A continuación, mostramos esta nueva clasificación real discretizada.
# Muestro clasificación real
plot(data, col=as.factor(data$sal3clusters), main="Clasificación real")
# Muestro la distribución real de cada cluster para saber a cual pertenece cada color
clusters = c("0-3251", "3252-5164", ">5164")
cluster_1 <- subset(data, sal3clusters==clusters[1])
plot(cluster_1, col=as.factor(cluster_1$sal3clusters), main=clusters[1])
cluster_2 <- subset(data, sal3clusters==clusters[2])
plot(cluster_2, col=as.factor(cluster_2$sal3clusters), main=clusters[2])
cluster_3 <- subset(data, sal3clusters==clusters[3])
plot(cluster_3, col=as.factor(cluster_3$sal3clusters), main=clusters[3])
Clasificación real:
Negro: [0-3251]
Rojo: [3252-5164]
Verde: >5164
A continuación, como técnica de medida externa, vamos a calcular la exactitud del modelo, es decir, el porcentaje de datos clasificados correctamente.
Tras generar un modelo k-means con 3 clusteres tenemos un vector de predicciones con valores 1, 2 o 3. El vector de etiquetas tiene los valores “0-3251”, “3252-5164” y “>5164”. Para saber a qué grupo pertenece cada valor, vamos a ver cuantas coincidencias hay para cada asignación posible.
# Coincidencias del cluster 1 con cada rango
coincidencias1 = c(
sum(data3clusters$cluster == 1 & data$sal3clusters == "0-3251"),
sum(data3clusters$cluster == 1 & data$sal3clusters == "3252-5164"),
sum(data3clusters$cluster == 1 & data$sal3clusters == ">5164"))
# Coincidencias del cluster 2 con cada rango
coincidencias2 = c(
sum(data3clusters$cluster == 2 & data$sal3clusters == "0-3251"),
sum(data3clusters$cluster == 2 & data$sal3clusters == "3252-5164"),
sum(data3clusters$cluster == 2 & data$sal3clusters == ">5164"))
# Coincidencias del cluster 3 con cada rango
coincidencias3 = c(
sum(data3clusters$cluster == 3 & data$sal3clusters == "0-3251"),
sum(data3clusters$cluster == 3 & data$sal3clusters == "3252-5164"),
sum(data3clusters$cluster == 3 & data$sal3clusters == ">5164"))
# Matriz de coincidencias
coincidencias <- data.frame(
"cluster" = numeric(),
"0-3251" = numeric(),
"3252-5164" = numeric(),
">5164" = numeric())
coincidencias <- rbind(coincidencias, c(1,coincidencias1))
coincidencias <- rbind(coincidencias, c(2,coincidencias2))
coincidencias <- rbind(coincidencias, c(3,coincidencias3))
colnames(coincidencias) <- c("cluster","0-3251","3252-5164",">5164")
print(coincidencias)
## cluster 0-3251 3252-5164 >5164
## 1 1 53 53 58
## 2 2 47 36 41
## 3 3 56 63 66
De esta forma, podemos asignar el cluster 1 al rango >5164, el cluster 2 al rango [0-3251] y el cluster 3 al rango [3252-5164].
data$predictions <- as.factor(
ifelse(data3clusters$cluster == 1, ">5164",
ifelse(data3clusters$cluster == 2, "0-3251",
ifelse(data3clusters$cluster == 3, "3252-5164", "NA"))))
print(head(data))
## Longitude Latitude minExp maxExp numeric.Job.Title numeric.Key.Skills
## 1 72.87739 19.07599 5 10 102 246
## 2 73.85445 18.52143 2 5 249 310
## 3 77.00270 28.42826 0 1 418 89
## 4 72.87739 19.07599 0 5 407 415
## 5 78.47406 17.36059 2 5 369 233
## 6 73.85445 18.52143 5 7 250 13
## numeric.Role.Category numeric.Location numeric.Functional.Area
## 1 6 84 29
## 2 46 100 35
## 3 45 72 8
## 4 4 84 15
## 5 39 79 23
## 6 39 98 15
## numeric.Industry numeric.Role sal3clusters predictions
## 1 4 67 3252-5164 >5164
## 2 32 102 0-3251 3252-5164
## 3 44 92 0-3251 0-3251
## 4 32 124 3252-5164 3252-5164
## 5 32 129 >5164 0-3251
## 6 32 117 3252-5164 0-3251
A continuación, calculamos la exactitud del modelo, calculada como \(\frac{datos\_bien\_clasificados}{datos\_totales}\).
exactitud <- sum(data$sal3clusters == data$predictions)/nrow(data)
print(exactitud)
## [1] 0.3551797
Como podemos observar, el modelo clasifica correctamente únicamente el 33,4% de los datos, lo cual es un resultado bastante pobre.
K = 4
A continuación repetimos el proceso anterior para k=4. Para ello, debo ignorar la variables ‘sal3clusters’ y ‘predictions’ creadas:
# Elimino las columnas 'sal3clusters' y 'predictions'
data <- select(data, -sal3clusters, -predictions)
# Aplico k-means para k=4
data4clusters <- kmeans(data, 4)
# Muestro clasificación obtenida por k-means
plot(data, col=data4clusters$cluster, main="Clasificación k-means")
A continuación, discretizamos la variable ‘sal’ para distribuir los datos en 4 clústeres. Para ello, vamos a calcular los cuantiles 25, 50 y 75 que marcarán los límites de los rangos de salario. Utilizaremos la función quantile() para obtener dichos límites:
quantile_25 <- quantile(dataAux$sal, 0.25)
quantile_50 <- quantile(dataAux$sal, 0.50)
quantile_75 <- quantile(dataAux$sal, 0.75)
print(quantile_25)
## 25%
## 2864.25
print(quantile_50)
## 50%
## 4213
print(quantile_75)
## 75%
## 5623
Obtenemos que, los límites para dividir los salarios en 3 grupos del mismo tamaño son 2864, 4213 y 5623 (redondeamos al entero más cercano).
# Discretizo "sal"
data$sal4clusters <- cut(na.omit(dataAux)$sal, c(0,2864,4213,5623,Inf), labels=c("0-2864", "2865-4213", "4214-5623", ">5623"))
# La almaceno en otra variable para no tener que recalcularlo posteriormente en el nuevo modelo
sal4clusters <- data$sal4clusters
summary(data$sal4clusters)
## 0-2864 2865-4213 4214-5623 >5623
## 119 115 119 120
Vemos que los datos se logran distribuir de forma equilibrada. A continuación, mostramos esta nueva clasificación real discretizada.
# Muestro clasificación real
plot(data, col=as.factor(data$sal4clusters), main="Clasificación real")
# Muestro la distribución real de cada cluster para saber a cual pertenece cada color
clusters = c("0-2864", "2865-4213", "4214-5623", ">5623")
cluster_1 <- subset(data, sal4clusters==clusters[1])
plot(cluster_1, col=as.factor(cluster_1$sal4clusters), main=clusters[1])
cluster_2 <- subset(data, sal4clusters==clusters[2])
plot(cluster_2, col=as.factor(cluster_2$sal4clusters), main=clusters[2])
cluster_3 <- subset(data, sal4clusters==clusters[3])
plot(cluster_3, col=as.factor(cluster_3$sal4clusters), main=clusters[3])
cluster_4 <- subset(data, sal4clusters==clusters[4])
plot(cluster_4, col=as.factor(cluster_4$sal4clusters), main=clusters[4])
Clasificación real:
Negro: [0-2864]
Rojo: [2865-4213]
Verde: [4214-5623]
Azul: >5623
A continuación, como técnica de medida externa, vamos a calcular la exactitud del modelo, es decir, el porcentaje de datos clasificados correctamente.
Tras generar un modelo k-means con 4 clusteres tenemos un vector de predicciones con valores 1, 2, 3 o 4. El vector de etiquetas tiene los valores “0-2864”, “2865-4213”, “4214-5623” y “>5623”. Para saber a qué grupo pertenece cada valor, vamos a ver cuantas coincidencias hay para cada asignación posible.
# Coincidencias del cluster 1 con cada rango
coincidencias1 = c(
sum(data4clusters$cluster == 1 & data$sal4clusters == "0-2864"),
sum(data4clusters$cluster == 1 & data$sal4clusters == "2865-4213"),
sum(data4clusters$cluster == 1 & data$sal4clusters == "4214-5623"),
sum(data4clusters$cluster == 1 & data$sal4clusters == ">5623"))
# Coincidencias del cluster 2 con cada rango
coincidencias2 = c(
sum(data4clusters$cluster == 2 & data$sal4clusters == "0-2864"),
sum(data4clusters$cluster == 2 & data$sal4clusters == "2865-4213"),
sum(data4clusters$cluster == 2 & data$sal4clusters == "4214-5623"),
sum(data4clusters$cluster == 2 & data$sal4clusters == ">5623"))
# Coincidencias del cluster 3 con cada rango
coincidencias3 = c(
sum(data4clusters$cluster == 3 & data$sal4clusters == "0-2864"),
sum(data4clusters$cluster == 3 & data$sal4clusters == "2865-4213"),
sum(data4clusters$cluster == 3 & data$sal4clusters == "4214-5623"),
sum(data4clusters$cluster == 3 & data$sal4clusters == ">5623"))
# Coincidencias del cluster 4 con cada rango
coincidencias4 = c(
sum(data4clusters$cluster == 4 & data$sal4clusters == "0-2864"),
sum(data4clusters$cluster == 4 & data$sal4clusters == "2865-4213"),
sum(data4clusters$cluster == 4 & data$sal4clusters == "4214-5623"),
sum(data4clusters$cluster == 4 & data$sal4clusters == ">5623"))
# Matriz de coincidencias
coincidencias <- data.frame(
"cluster" = numeric(),
"0-2864" = numeric(),
"2865-4213" = numeric(),
"4214-5623" = numeric(),
">5623" = numeric())
coincidencias <- rbind(coincidencias, c(1,coincidencias1))
coincidencias <- rbind(coincidencias, c(2,coincidencias2))
coincidencias <- rbind(coincidencias, c(3,coincidencias3))
coincidencias <- rbind(coincidencias, c(4,coincidencias4))
colnames(coincidencias) <- c("cluster","0-2864","2865-4213","4214-5623",">5623")
print(coincidencias)
## cluster 0-2864 2865-4213 4214-5623 >5623
## 1 1 28 20 32 23
## 2 2 31 39 27 38
## 3 3 24 24 27 27
## 4 4 36 32 33 32
De esta forma, podemos asignar el cluster 1 al rango [4214-5623], el cluster 2 al rango >5623, el cluster 3 al rango [0-2864] y el cluster 4 al rango [2865-4213].
data$predictions <- as.factor(
ifelse(data4clusters$cluster == 1, "4214-5623",
ifelse(data4clusters$cluster == 2, ">5623",
ifelse(data4clusters$cluster == 3, "0-2864",
ifelse(data4clusters$cluster == 4, "2865-4213", "NA")))))
print(head(data))
## Longitude Latitude minExp maxExp numeric.Job.Title numeric.Key.Skills
## 1 72.87739 19.07599 5 10 102 246
## 2 73.85445 18.52143 2 5 249 310
## 3 77.00270 28.42826 0 1 418 89
## 4 72.87739 19.07599 0 5 407 415
## 5 78.47406 17.36059 2 5 369 233
## 6 73.85445 18.52143 5 7 250 13
## numeric.Role.Category numeric.Location numeric.Functional.Area
## 1 6 84 29
## 2 46 100 35
## 3 45 72 8
## 4 4 84 15
## 5 39 79 23
## 6 39 98 15
## numeric.Industry numeric.Role sal4clusters predictions
## 1 4 67 2865-4213 0-2864
## 2 32 102 0-2864 2865-4213
## 3 44 92 0-2864 4214-5623
## 4 32 124 2865-4213 2865-4213
## 5 32 129 4214-5623 4214-5623
## 6 32 117 4214-5623 4214-5623
A continuación, calculamos la exactitud del modelo
exactitud <- sum(data$sal4clusters == data$predictions)/nrow(data)
print(exactitud)
## [1] 0.2663848
Como podemos observar, el modelo clasifica correctamente únicamente el 27,48% de los datos, lo cual es un resultado bastante pobre.
Tanto en la clasificación con 3 como con 4 clústeres, no se aprecia una distribución clara de las clases, lo cual significa que los puntos de datos en el conjunto de entrenamiento no están claramente agrupados o separados en los tres clusters especificados. Como resultado, el modelo generado es será capaz de clasificar correctamente los puntos de datos, y, por lo tanto, el resultado no coincide con la clasificación real. Además, esto también puede generar un alto grado de incertidumbre en las predicciones ya que el modelo no tiene una buena comprensión de cómo las diferentes clases están distribuidas en los datos. Para mejorar el rendimiento del modelo, es recomendable revisar el proceso de selección de características y la metodología utilizada para agrupar los datos, para asegurar que los datos están siendo agrupados de manera adecuada y significativa en relación con la variable de clasificación.
Además, las medidas de calidad obtenidas también apoyan esta conclusión. La Silueta media es una medida de similitud entre los puntos de datos dentro de un cluster y los puntos de datos en otros clusters, un valor cercano a 1 indica alta similitud entre los puntos dentro del mismo cluster y baja similitud entre los puntos de diferentes clusters, un valor cercano a -1 indica que los puntos de un cluster son más similares a los de otro cluster diferente al que esta asignado. El hecho de que la silueta media sea cercana a 0.35 indica que la similitud entre los puntos dentro del mismo cluster es moderada, pero puede no ser suficiente para considerarlo como un buen modelo.
También se podría utilizar el Coeficiente de Calinski-Harabasz, en el que se obtiene un valor máximo cercano a 350 para k=4. Aunque un alto valor de CH es normalmente considerado como indicativo de una buena agrupación, en este caso, es importante tener en cuenta que este coeficiente tiene una dependencia directa con el número de observaciones y clústeres, por lo que no se puede comparar entre diferentes conjuntos de datos o configuraciones del algoritmo. Por tanto, estos resultados deben ser interpretados en combinación con otras medidas de calidad y conocer el contexto del problema. Además, se observa que el valor obtenido para k = 2 es muy bajo, este puede ser un indicativo de que el agrupamiento no es significativo, ya que con solo dos clusters no se tiene suficiente capacidad de dividir los datos en grupos relevantes.
Por último, al calcular la exactitud se aprecia que ambos modelos, tanto el de 3 como el de 4 clústeres, tienen un rendimiento bajo, con una exactitud del 33% y 28% respectivamente. Esto indica que el modelo no es capaz de clasificar correctamente la gran mayoría de los puntos de datos en el conjunto de entrenamiento, lo que también sugiere que los datos no están siendo agrupados de manera adecuada
En conclusión, el análisis de los resultados y las medidas de calidad sugieren que el modelo generado no es capaz de clasificar correctamente los puntos de datos, y presenta un alto grado de incertidumbre en las predicciones. Es recomendable revisar el proceso de selección de características y la metodología utilizada para agrupar los datos para mejorar el rendimiento del modelo y asegurar que los datos están siendo agrupados de manera adecuada y significativa en relación con la variable de clasificación.
El algoritmo k-means utiliza como métrica de distancia la distancia Euclidiana, una medida de distancia que se calcula como \(\sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}\). Es una medida que tiene en cuenta la distancia en cada dimensión entre dos puntos, y es considerada como una medida de distancia “real” ya que cumple con las propiedades de distancia, es decir, es simétrica, positiva y cumple con el triangulo.
Sin embargo, es importante tener en cuenta que existen otras medidas de distancia que pueden ser más adecuadas para ciertos tipos de datos o problemas, como la distancia de Manhattan, la distancia de Mahalanobis, entre otras.
En este caso vamos a utilizar la distancia Manhattan, también conocida como distancia L1, es una medida de distancia entre dos puntos en un espacio n-dimensional. Se calcula sumando la diferencia absoluta entre las coordenadas de cada punto. Es decir, se calcula la suma de las diferencias absolutas entre las coordenadas de cada punto. Esta distancia es útil en problemas en los que las coordenadas de los puntos representan distancias o tiempos, y se desea medir el costo total de viajar entre dos puntos. La fórmula para calcular la distancia de Manhattan entre dos puntos \(x=(x_1,x_2,..,x_n)\) y \(y=(y_1,y_2,..,y_n)\) es: \(d(x,y)= \sum_{i}{\|x_i-y_i\|}\).
La distancia de Manhattan es una medida de distancia más restrictiva que la distancia Euclidiana, ya que no tiene en cuenta la dirección de los puntos, sólo la distancia en las dimensiones individuales. Por lo tanto, la distancia de Manhattan se utiliza comúnmente en problemas en los que la distancia Euclidiana no es adecuada.
Dado que el algoritmo k-means únicamente aplica la métrica de distancia Euclidiana, para utilizar la distancia Manhattan vamos a utilizar el algoritmo Hierarchical Clustering, un algoritmo que se utiliza para agrupar un conjunto de objetos en diferentes grupos (clusters) de acuerdo a cierta medida de similitud. Existen dos tipos de enfoques para el agrupamiento jerárquico: el enfoque aglomerativo y el enfoque divisivo.
La función hclust() utiliza el enfoque aglomerativo, que comienza con cada punto de datos como un cluster individual y, a medida que se avanza en el proceso, va combinando los clusters más cercanos en un único cluster hasta que todos los puntos de datos estén agrupados en un solo cluster. Esta función utiliza una medida de distancia para calcular la similitud entre los puntos de datos y los centroides de cada cluster, y se pueden pasar diferentes medidas de distancia como argumentos.
Además, se utilizará la función daisy() del paquete cluster para calcular la matriz de distancias utilizando la distancia de Manhattan y luego pasarla como argumento a la función hclust().
# Recuperamos los datos preprocesados
data <- dataAux
# Eliminamos valores nulos que hayan podido quedar tras el preprocesado
data <- na.omit(data)
# Ya que se trata de un modelo no supervisado, vamos a eliminar la columna de las etiquetas 'sal'
data <- select(data, -sal)
# Creo el modelo Hierarchical Clustering
hc_model <- hclust(daisy(data, metric = "manhattan"))
# Exporto el árbol a png
if(!require(grid)) install.packages('grid'); library(grid)
## Loading required package: grid
png("hc_tree_manhattan.png", res=80, height=1200, width=2800)
plot(hc_model, gp = gpar(fontsize = 30))
## Warning in graphics:::plotHclust(n1, merge, height, order(x$order), hang, : "gp"
## is not a graphical parameter
## Warning in graphics:::plotHclust(n1, merge, height, order(x$order), hang, : "gp"
## is not a graphical parameter
## Warning in axis(2, at = pretty(range(height)), ...): "gp" is not a graphical
## parameter
## Warning in title(main = main, sub = sub, xlab = xlab, ylab = ylab, ...): "gp" is
## not a graphical parameter
dev.off()
## png
## 2
La función png() es utilizada para crear un archivo de imagen en formato PNG con una resolución de 80 píxeles por pulgada, una altura de 1200 píxeles y un ancho de 2800 píxeles y poder de esta forma visualizar con mayor facilidad el agrupamiento jerárquico generado. La función plot() es utilizada para dibujar el modelo de árbol de decisión especificado en el archivo de imagen, y la función gpar() se utiliza para especificar algunos parámetros de gráfico adicionales, como el tamaño de la fuente. Finalmente, la función dev.off() se utiliza para cerrar el dispositivo de gráficos y guardar el archivo de imagen.
A continuación, una vez generado el modelo, debemos asignar los puntos de datos a los clusteres correspondientes. Para ello, utilizamos la función cutree(), una función del paquete stats que se utiliza para cortar el dendrograma generado por hclust() y asignar los puntos de datos a los clusters correspondientes. Esta función toma como entrada el objeto “hc_model” generado por hclust() y un número k que representa el número de clusters deseados. La función devuelve un vector de etiquetas, donde cada etiqueta representa a qué cluster pertenece cada punto de datos.
Al igual que con k-means, probaremos con k=3 y con k=4.
k=3
if (!require('stats')) install.packages('stats'); library(stats)
# Asigno los puntos de datos a 3 clusteres
data3clusters <- cutree(hc_model, k = 3)
# Muestro clasificación obtenida por k-means
plot(data, col=data3clusters, main="Clasificación hc")
A continuación, como técnica de medida externa, vamos a calcular la exactitud del modelo, es decir, el porcentaje de datos clasificados correctamente.
Tras generar un modelo k-means con 3 clusteres tenemos un vector de predicciones con valores 1, 2 o 3. El vector de etiquetas tiene los valores “0-3251”, “3252-5164” y “>5164”. Para saber a qué grupo pertenece cada valor, vamos a ver cuantas coincidencias hay para cada asignación posible.
# Coincidencias del cluster 1 con cada rango
coincidencias1 = c(
sum(data3clusters == 1 & sal3clusters == "0-3251"),
sum(data3clusters == 1 & sal3clusters == "3252-5164"),
sum(data3clusters == 1 & sal3clusters == ">5164"))
# Coincidencias del cluster 2 con cada rango
coincidencias2 = c(
sum(data3clusters == 2 & sal3clusters == "0-3251"),
sum(data3clusters == 2 & sal3clusters == "3252-5164"),
sum(data3clusters == 2 & sal3clusters == ">5164"))
# Coincidencias del cluster 3 con cada rango
coincidencias3 = c(
sum(data3clusters == 3 & sal3clusters == "0-3251"),
sum(data3clusters == 3 & sal3clusters == "3252-5164"),
sum(data3clusters == 3 & sal3clusters == ">5164"))
# Matriz de coincidencias
coincidencias <- data.frame(
"cluster" = numeric(),
"0-3251" = numeric(),
"3252-5164" = numeric(),
">5164" = numeric())
coincidencias <- rbind(coincidencias, c(1,coincidencias1))
coincidencias <- rbind(coincidencias, c(2,coincidencias2))
coincidencias <- rbind(coincidencias, c(3,coincidencias3))
colnames(coincidencias) <- c("cluster","0-3251","3252-5164",">5164")
print(coincidencias)
## cluster 0-3251 3252-5164 >5164
## 1 1 16 32 29
## 2 2 70 63 66
## 3 3 70 57 70
De esta forma, podemos asignar el cluster 1 al rango [3252-5164], el cluster 2 al rango [0-3251] y el cluster 3 al rango >5164.
data$predictions <- as.factor(
ifelse(data3clusters == 1, "3252-5164",
ifelse(data3clusters == 2, "0-3251",
ifelse(data3clusters == 3, ">5164", "NA"))))
print(head(data))
## Longitude Latitude minExp maxExp numeric.Job.Title numeric.Key.Skills
## 1 72.87739 19.07599 5 10 102 246
## 2 73.85445 18.52143 2 5 249 310
## 3 77.00270 28.42826 0 1 418 89
## 4 72.87739 19.07599 0 5 407 415
## 5 78.47406 17.36059 2 5 369 233
## 6 73.85445 18.52143 5 7 250 13
## numeric.Role.Category numeric.Location numeric.Functional.Area
## 1 6 84 29
## 2 46 100 35
## 3 45 72 8
## 4 4 84 15
## 5 39 79 23
## 6 39 98 15
## numeric.Industry numeric.Role predictions
## 1 4 67 3252-5164
## 2 32 102 0-3251
## 3 44 92 0-3251
## 4 32 124 0-3251
## 5 32 129 0-3251
## 6 32 117 >5164
A continuación, calculamos la exactitud del modelo:
exactitud <- sum(sal3clusters == data$predictions)/nrow(data)
print(exactitud)
## [1] 0.3636364
Como podemos observar, el modelo clasifica correctamente únicamente el 36,36% de los datos, lo cual es un resultado bastante pobre.
k=4
# Asigno los puntos de datos a 3 clusteres
data4clusters <- cutree(hc_model, k = 4)
# Muestro clasificación obtenida por k-means
plot(data, col=data4clusters, main="Clasificación hc")
A continuación, como técnica de medida externa, vamos a calcular la exactitud del modelo, es decir, el porcentaje de datos clasificados correctamente.
Tras generar un modelo k-means con 4 clusteres tenemos un vector de predicciones con valores 1, 2, 3 o 4. El vector de etiquetas tiene los valores “0-2864”, “2865-4213”, “4214-5623” y “>5623”. Para saber a qué grupo pertenece cada valor, vamos a ver cuantas coincidencias hay para cada asignación posible.
# Coincidencias del cluster 1 con cada rango
coincidencias1 = c(
sum(data4clusters == 1 & sal4clusters == "0-2864"),
sum(data4clusters == 1 & sal4clusters == "2865-4213"),
sum(data4clusters == 1 & sal4clusters == "4214-5623"),
sum(data4clusters == 1 & sal4clusters == ">5623"))
# Coincidencias del cluster 2 con cada rango
coincidencias2 = c(
sum(data4clusters == 2 & sal4clusters == "0-2864"),
sum(data4clusters == 2 & sal4clusters == "2865-4213"),
sum(data4clusters == 2 & sal4clusters == "4214-5623"),
sum(data4clusters == 2 & sal4clusters == ">5623"))
# Coincidencias del cluster 3 con cada rango
coincidencias3 = c(
sum(data4clusters == 3 & sal4clusters == "0-2864"),
sum(data4clusters == 3 & sal4clusters == "2865-4213"),
sum(data4clusters == 3 & sal4clusters == "4214-5623"),
sum(data4clusters == 3 & sal4clusters == ">5623"))
# Coincidencias del cluster 4 con cada rango
coincidencias4 = c(
sum(data4clusters == 4 & sal4clusters == "0-2864"),
sum(data4clusters == 4 & sal4clusters == "2865-4213"),
sum(data4clusters == 4 & sal4clusters == "4214-5623"),
sum(data4clusters == 4 & sal4clusters == ">5623"))
# Matriz de coincidencias
coincidencias <- data.frame(
"cluster" = numeric(),
"0-2864" = numeric(),
"2865-4213" = numeric(),
"4214-5623" = numeric(),
">5623" = numeric())
coincidencias <- rbind(coincidencias, c(1,coincidencias1))
coincidencias <- rbind(coincidencias, c(2,coincidencias2))
coincidencias <- rbind(coincidencias, c(3,coincidencias3))
coincidencias <- rbind(coincidencias, c(4,coincidencias4))
colnames(coincidencias) <- c("cluster","0-2864","2865-4213","4214-5623",">5623")
print(coincidencias)
## cluster 0-2864 2865-4213 4214-5623 >5623
## 1 1 14 18 25 20
## 2 2 41 30 33 30
## 3 3 17 14 19 15
## 4 4 47 53 42 55
De esta forma, podemos asignar el cluster 1 al rango [4214-5623], el cluster 2 al rango [0-2864], el cluster 3 al rango [2865-4213] y el cluster 4 al rango >5623.
data$predictions <- as.factor(
ifelse(data4clusters == 1, "4214-5623",
ifelse(data4clusters == 2, "0-2864",
ifelse(data4clusters == 3, "2865-4213",
ifelse(data4clusters == 4, ">5623", "NA")))))
print(head(data))
## Longitude Latitude minExp maxExp numeric.Job.Title numeric.Key.Skills
## 1 72.87739 19.07599 5 10 102 246
## 2 73.85445 18.52143 2 5 249 310
## 3 77.00270 28.42826 0 1 418 89
## 4 72.87739 19.07599 0 5 407 415
## 5 78.47406 17.36059 2 5 369 233
## 6 73.85445 18.52143 5 7 250 13
## numeric.Role.Category numeric.Location numeric.Functional.Area
## 1 6 84 29
## 2 46 100 35
## 3 45 72 8
## 4 4 84 15
## 5 39 79 23
## 6 39 98 15
## numeric.Industry numeric.Role predictions
## 1 4 67 4214-5623
## 2 32 102 0-2864
## 3 44 92 2865-4213
## 4 32 124 0-2864
## 5 32 129 2865-4213
## 6 32 117 >5623
A continuación, calculamos la exactitud del modelo:
exactitud <- sum(sal4clusters == data$predictions)/nrow(data)
print(exactitud)
## [1] 0.2854123
Como podemos observar, el modelo clasifica correctamente únicamente el 28,54% de los datos, lo cual es un resultado bastante pobre.
El modelo de Hierarchical Clustering obtiene una exactitud del 36,36% para k=3, y del 28,54% para k=4, unos resultados muy similares a los del modelo de k-means.
En el caso de Hierarchical Clustering, si utilizamos la distancia Manhattan para medir la similitud entre los puntos de datos y los clusters, el algoritmo será sensible a las diferencias en las escalas de los atributos y será capaz de manejar mejor los conjuntos de datos con escalas diferentes. Sin embargo, es importante tener en cuenta que la distancia Manhattan tiende a generar clusters más compactos y menos dispersos que la distancia Euclidea. Esto podría dar lugar a una mejor separación entre los puntos de datos pertenecientes a diferentes clusters, pero también podría generar clusters menos significativos si los datos no están distribuidos de manera compacta.
En primer lugar, al utilizar la distancia Euclidiana en el algoritmo k-means, se estaría midiendo la similitud entre los puntos de datos y los centroides de los clusters en términos de su distancia geométrica, es decir, cuán cerca o lejos están los puntos de datos de los centroides de los clusters en el espacio de los atributos. A menor distancia Euclidiana entre un punto de datos y el centroide de un cluster, mayor será la similitud entre el punto de datos y el cluster. Esto podría ser adecuado para conjuntos de datos donde los atributos tienen la misma escala y son numéricos. Sin embargo, si los atributos tienen escalas diferentes o son categóricos, la distancia Euclidiana podría no ser la mejor opción.
Por otro lado, al utilizar la distancia Manhattan en el algoritmo Hierarchical Clustering se estaría midiendo la similitud entre los puntos de datos y los clusters en términos de la suma de las diferencias absolutas de las coordenadas de los puntos. Esto podría ser adecuado para conjuntos de datos con escalas diferentes o con atributos categóricos, ya que es menos sensible a las diferencias en las escalas. Sin embargo, la distancia Manhattan tiende a generar clusters más compactos y menos dispersos, lo que podría generar clusters menos significativos si los datos no están distribuidos de manera compacta.
En resumen, comparar los dos modelos no supervisados con métricas de distancia distintas es importante para evaluar cuál de ellos es más adecuado para el conjunto de datos específico. La distancia euclidiana es adecuada para conjuntos de datos donde los atributos tienen la misma escala y son numéricos, mientras que la distancia Manhattan es más adecuada para conjuntos de datos con escalas diferentes o con atributos categóricos. Es importante evaluar las medidas de calidad del modelo y conocer el contexto del problema para determinar cuál de las dos distancias es la mejor opción para el agrupamiento de los datos.
Los resultados obtenidos indican que tanto el modelo generado con el algoritmo k-means y como el generado con el algoritmo Hierarchical Clustering no son capaces de clasificar correctamente la gran mayoría de los puntos de datos. Esto se debe a que los puntos de datos no están claramente agrupados o separados en los clústeres especificados, lo cual genera un alto grado de incertidumbre en las predicciones y un rendimiento bajo en las medidas de calidad obtenidas.
Por ello, para este tipo de problemas se suelen utilizar modelos de regresión, que permiten predecir una variable continua en función de otras variables, en lugar de clasificar puntos de datos en diferentes categorías. Estos modelos de regresión pueden ser más precisos y fiables en situaciones donde los datos no están claramente agrupados o separados en los clústeres especificados. En general, es importante evaluar diferentes metodologías y técnicas para encontrar el enfoque más adecuado para cada problema específico y lograr un buen rendimiento del modelo.
En este ejercicio vamos ha trabajar los algoritmos DBSCAN y OPTICS como métodos de clustering que permiten la generación de grupos no radiales a diferencia de k-means. Es decir, el algoritmo k-means estructuralmente está construido alrededor del concepto de distancia de cada observación a su centroide asignado, este diseño provoca que k-means tenga tendencia a generar grupos con forma esférica colocando el centroide en el centro.
Veremos que su parámetro de entrada más relevante es minPts que define la mínima densidad aceptada alrededor de un centroide. Incrementar este parámetro nos permitirá reducir el ruido (observaciones no asignadas a ningún cluster).
El algoritmo DBSCAN (Density-based Spatial Clustering of Applications with Noise) requiere que se le informe de dos parámetros:
El valor ε (epsilon): máximo radio de vecindad. Consideraremos que dos puntos u observaciones están cercanos si la distancia que los separa es menor o igual a ε.
El valor minPts: mínimo número de puntos en la ε-vecindad de un punto. Podemos pensarlo como el valor que marcará nuestro criterio de qué consideramos como denso.
De este modo, DBSCAN irá construyendo esferas de radio ε que al menos incluyan minPts observaciones. La lógica que sigue el algoritmo para construir los clústeres o zonas densamente pobladas es la siguiente:
Se considera que un punto p es un punto núcleo, core point, si al menos tiene minPts puntos a una distancia menor o igual a ε. Dicho de otro modo, contiene minPts en la ε-vecindad.
Un punto q es alcanzable desde p, (p-reachable), donde p es núcleo, si la distancia entre ambos es inferior o igual a ε. Dicho de otro modo, si está dentro de la ε-vecindad de p.
Un punto q es alcanzable desde p, si existe un camino de puntos núcleo que los conecta. Explicado más formalmente, si existe p1,...,pn, con p1 = p y pn = q, donde cada pi+1 es alcanzable por pi y todos los p1,...,pn-1 son puntos núcleo.
Cualquier punto no alcanzable se considerará punto extremo o outlier.
La siguiente figura nos muestra de un modo esquemático, el proceso de construcción de zonas de densidad. En este ejemplo se toma minPts = 4.
Los puntos B y C corresponden a la frontera del clúster, es decir, son puntos alcanzables desde un punto núcleo, pero ellos mismo no son punto núcleo porque no incluyen minPts en su ε-vecindario. Los puntos A son puntos núcleo ya que como mínimo cada uno de ellos tiene 4 puntos en un radio ε pre-fijado. Finalmente, el punto N se considera extremo o outlier puesto que no es alcanzable desde ningún punto del juego de datos.
Por su parte, el algoritmo OPTICS (Ordering Points to Identify Cluster Structure), es un algoritmo que de algún modo generaliza DBSCAN y resuelve su principal inconveniente: los parámetros iniciales.
OPTICS requiere un radio ε y un criterio de densidad minPts igual que DBSCAN, pero en el caso de OPTICS el valor de radio ε no determinará la formación de clústeres sino que servirá para ayudar a reducir la complejidad de cálculo en el propio algoritmo. En realidad OPTICS no es un algoritmo que genere una propuesta de clústeres a partir de un juego de datos de entrada, como DBSCAN. De hecho, lo que hace es ordenar los puntos del juego de datos en función de su distancia de alcanzabilidad, o reachability distance, en inglés. Para entender bien este concepto nuevo, nos basaremos en la siguiente figura, donde hemos tomado minPts = 5.
La core-distance del punto p es el radio ε’ mínimo tal que su ε′-vecindad contiene al menos minPts = 5 puntos. La reachability-distance de un punto q respecto de un punto núcleo (corepoint) p será la mayor de las dos distancias siguientes:
core-distance del punto p,
distancia euclidiana entre los puntos p y q, que denotaremos por d(p,q).
Siguiendo con el ejemplo de la figura anterior, vemos cómo la reachability-distance de los puntos p y q1 es la core-distance del punto p, porque esta es mayor que la distancia euclidiana entre los puntos p y q. Por otro lado, la reachability-distance de los puntos p y q2 es la distancia euclidiana entre ellos, porque esta es mayor que la core-distance del punto p. OPTICS como algoritmo lo que nos va a hacer es asignar a cada punto del juego de datos una reachability-distance. Aclarados estos conceptos básicos, podemos avanzar en la comprensión de la utilidad de disponer de dicha ordenación. Para ello usaremos un tipo de gráfico específico para este algoritmo, el reachability plot. Para entender bien qué es un reachability plot veamos la siguiente figura. En el gráfico inferior vemos la reachability-distance asignada a cada punto y apreciamos como hay zonas con valores altos que se corresponden con los puntos outliers y zonas con valores muy bajos que se corresponden con puntos ubicados en zonas densas.
Fijémonos que a la hora de generar los clústeres podremos decidir cuál es la reachability-distance límite que nos marca qué consideramos como clúster. Podremos calibrar o ajustar este valor límite hasta conseguir una generación de clústeres adecuada. La posibilidad de calibrar la reachability-distance límite, hace que OPTICS en realidad lo que nos dé es una ordenación de puntos por reachability-distance y en consecuencia será el propio analista quien podrá generar múltiples combinaciones de clústeres en función del límite que se quiera fijar. Una de las primeras actividades que realiza el algoritmo es ordenar las observaciones de forma que los puntos más cercanos se conviertan en vecinos en el ordenamiento. Se podría pensar como una representación numérica del dendograma de una agrupación jerárquica.
# Añadimos la librería 'dbscan'
if (!require('dbscan')) install.packages('dbscan'); library(dbscan)
## Loading required package: dbscan
##
## Attaching package: 'dbscan'
## The following object is masked from 'package:fpc':
##
## dbscan
## The following object is masked from 'package:stats':
##
## as.dendrogram
# Recuperamos los datos preprocesados
data <- dataAux
# Eliminamos valores nulos que hayan podido quedar tras el preprocesado
data <- na.omit(data)
# Ya que se trata de un modelo no supervisado, vamos a eliminar la columna de las etiquetas 'sal'
data <- select(data, -sal)
# Lanzamos el algoritmo OPTICS dejando el parámetro eps con su valor por defecto y fijando el criterio de vecindad en 10
res <- optics(data, minPts = 10)
res
## OPTICS ordering/clustering for 473 objects.
## Parameters: minPts = 10, eps = 130.094433618848, eps_cl = NA, xi = NA
## Available fields: order, reachdist, coredist, predecessor, minPts, eps,
## eps_cl, xi
# Obtenemos la ordenación de las observaciones o puntos
res$order
## [1] 1 392 441 401 426 458 415 336 319 169 121 45 40 467 221 120 431 419
## [19] 364 436 228 188 100 449 369 271 151 123 22 240 359 2 138 323 413 420
## [37] 137 424 340 272 204 105 396 433 181 313 428 222 409 471 429 421 404 380
## [55] 305 135 79 4 98 400 141 446 276 216 170 12 388 43 322 227 209 423
## [73] 397 355 291 265 116 29 383 347 88 183 226 67 52 435 408 379 14 111
## [91] 457 41 443 368 463 456 452 341 333 318 220 179 140 5 353 373 326 277
## [109] 357 338 360 343 260 223 182 46 32 31 472 447 16 407 15 92 330 434
## [127] 266 73 157 311 238 66 384 101 406 199 72 437 455 381 300 282 371 403
## [145] 335 310 288 278 261 444 129 104 70 90 459 432 427 387 295 351 309 264
## [163] 171 50 19 142 448 301 102 460 211 210 306 225 242 6 430 255 212 89
## [181] 71 24 7 296 252 18 87 308 297 287 249 127 68 54 28 84 83 8
## [199] 201 109 327 232 192 385 234 174 215 294 410 356 292 376 328 317 244 124
## [217] 398 332 231 202 198 77 411 236 119 57 42 414 394 224 175 147 99 417
## [235] 159 65 378 163 362 96 320 412 281 262 273 251 217 178 164 39 33 206
## [253] 290 133 375 348 155 134 366 345 280 139 97 62 145 51 93 314 189 451
## [271] 289 257 239 23 20 184 445 117 331 329 203 132 126 118 64 344 416 185
## [289] 470 372 60 454 440 207 11 399 365 285 270 177 302 229 214 131 154 374
## [307] 284 462 386 254 241 153 148 130 158 237 367 160 464 468 315 107 80 25
## [325] 186 361 144 233 358 465 438 21 350 208 197 173 167 9 391 334 267 69
## [343] 146 48 256 304 187 112 321 3 342 279 13 425 149 219 405 195 191 193
## [361] 125 95 168 37 337 213 176 286 316 473 377 248 247 218 136 36 194 53
## [379] 78 259 382 86 27 59 466 161 108 91 230 363 354 299 269 200 122 103
## [397] 81 74 55 75 94 439 190 85 370 34 349 106 258 253 35 298 128 47
## [415] 346 44 325 393 339 115 250 152 450 442 268 418 205 180 166 162 113 61
## [433] 58 30 275 389 469 114 235 150 196 156 307 10 402 453 274 82 56 390
## [451] 243 76 165 303 263 246 63 422 245 395 293 324 17 283 38 312 49 352
## [469] 143 110 461 172 26
Otro paso muy interesante del algoritmo es la generación de un diagrama de alcanzabilidad o reachability plot, en el que se aprecia de una forma visual la distancia de alcanzabilidad de cada punto.
Los valles representan clusters (cuanto más profundo es el valle, más denso es el cluster), mientras que las cimas indican los puntos que están entre las agrupaciones (estos puntos son cadidatos a ser considerados outliers)
# Gráfica de alcanzabilidad
plot(res)
Veamos otra representación del diagrama de alcanzabilidad, donde podemos observar las trazas de las distancias entre puntos cercanos del mismo cluster y entre clusters distintos. Por simplificidad, vamos a visualizar solo algunas de las trazas:
# Dibujo de las trazas que relacionan puntos
# Longitude y Latitude
plot(data[c(1,2)], col = "grey")
polygon(data[c(1,2)][res$order,])
# minExp y maxExp
plot(data[c(3,4)], col = "grey")
polygon(data[c(3,4)][res$order,])
# numeric.Job.Title y numeric.Key.Skills
plot(data[c(5,6)], col = "grey")
polygon(data[c(5,6)][res$order,])
# numeric.Role.Category y numeric.Location
plot(data[c(7,8)], col = "grey")
polygon(data[c(7,8)][res$order,])
# numeric.Functional.Area y numeric.Industry
plot(data[c(9,10)], col = "grey")
polygon(data[c(9,10)][res$order,])
# numeric.Role y Longitude
plot(data[c(11,1)], col = "grey")
polygon(data[c(11,1)][res$order,])
Otro ejercicio interesante a realizar es extraer una agrupación de la ordenación realizada por OPTICS similar a lo que DBSCAN hubiera generado estableciendo el parámetro eps en eps_cl = 0.065. Se puede utilizar el algoritmo OPTICS como una forma de preprocesar los datos antes de aplicar DBSCAN. El algoritmo OPTICS puede proporcionar una representación jerárquica de los datos que permite determinar automáticamente los valores óptimos de los parámetros de DBSCAN (eps y min_samples) y puede ser útil para manejar conjuntos de datos con varias escalas de densidad.
### Extracción de un clustering DBSCAN cortando la alcanzabilidad en el valor eps_cl
res <- extractDBSCAN(res, eps_cl = .065)
res
## OPTICS ordering/clustering for 473 objects.
## Parameters: minPts = 10, eps = 130.094433618848, eps_cl = 0.065, xi = NA
## The clustering contains 0 cluster(s) and 473 noise points.
##
## 0
## 473
##
## Available fields: order, reachdist, coredist, predecessor, minPts, eps,
## eps_cl, xi, cluster
plot(res) ## negro indica ruido
En este caso, se ve la gráfica de alcanzabilidad completamente negra. Esto se debe a que el valor de eps_cl no es lo suficientemente grande y por tanto no se alcanzan minPts vecinos dentro del radio definido por eps_cl, definiendo todos los puntos como ruido.
A continuación, mediante la función hullplot() vamos a visualizar los resultados del agrupamiento. Esta función dibuja un gráfico de cajas que representa los diferentes niveles jerárquicos del agrupamiento. Cada caja representa un cluster y su tamaño se relaciona con el número de puntos de datos en ese cluster. Los clusters se conectan mediante líneas que representan las relaciones jerárquicas entre ellos. Esto nos visualizar de manera gráfica cómo los puntos de datos están agrupados en diferentes niveles jerárquicos y cómo estos clusters están relacionados entre sí.
hullplot(data, res)
Como se puede apreciar, no se ha detectado ningún cluster.
Repetimos el experimento anterior aumentando el valor de eps_cl, aumentando así el radio en el que se acepte un vecino, permitiendo que sea más factible alcanzar mintPts vecinos.
### Incrementamos el parámetro eps
res <- extractDBSCAN(res, eps_cl = 50)
res
## OPTICS ordering/clustering for 473 objects.
## Parameters: minPts = 10, eps = 130.094433618848, eps_cl = 50, xi = NA
## The clustering contains 3 cluster(s) and 440 noise points.
##
## 0 1 2 3
## 440 8 14 11
##
## Available fields: order, reachdist, coredist, predecessor, minPts, eps,
## eps_cl, xi, cluster
plot(res)
hullplot(data, res)
En este caso ya se logran generar algunos clústeres, aunque sigue habiendo mucho ruido debido a que eps_cl sigue sin ser lo suficientemente grande.
A continuación, calculamos el valor promedio de la silueta para cuantificar la calidad del agrupamiento.
# Calculo disimilaridad de los datos
d <- daisy(data)
sk <- silhouette(res$cluster, d)
print(mean(sk[,3]))
## [1] -0.1349633
Como cabía esperar, obtenemos un valor muy bajo. Esto se debe a que, a pesar de que los puntos de un clúster están muy cercanos entre sí, hay muchos puntos clasificados como ruido, pero que siguen estando muy cerca de algún clúster, teniendo puntos en el clúster vecino muy cercanos, y reduciendo así la calidad del agrupamiento.
Por tanto volvemos a repetir con un valor de eps_cl aún mayor:
resultados <- rep(0, 45)
eps = seq(50,95,by=1)
for (i in 1:45)
{
res <- extractDBSCAN(res, eps_cl = eps[i])
d <- daisy(data)
sk <- silhouette(res$cluster, d)
resultados[i] <- mean(sk[,3])
}
# Muestro la evolución del valor promedio de la silueta
plot(51:95,resultados,type="o",col="blue",pch=0,xlab="Número de clusters",ylab="silhouette")
A pesar de ver que el valor promedio de la silueta sigue aumentando a medida que aumenta el valor de épsilon, llega un momento en el que no se puede aumentar más porque agrupa a todos los puntos en un único clúster. Vamos a analizar qué sucede en el caso de eps=95.
### Incrementamos el parámetro eps
res <- extractDBSCAN(res, eps_cl = 95)
res
## OPTICS ordering/clustering for 473 objects.
## Parameters: minPts = 10, eps = 130.094433618848, eps_cl = 95, xi = NA
## The clustering contains 1 cluster(s) and 3 noise points.
##
## 0 1
## 3 470
##
## Available fields: order, reachdist, coredist, predecessor, minPts, eps,
## eps_cl, xi, cluster
plot(res)
hullplot(data, res)
Observamos en los gráficos anteriores como se ha coloreado un único cluster y en negro se mantienen los valores outliers o extremos.
Volvemos a calcular el valor promedio de la silueta para cuantificar la calidad de este nuevo agrupamiento.
# Calculo disimilaridad de los datos
d <- daisy(data)
sk <- silhouette(res$cluster, d)
print(mean(sk[,3]))
## [1] 0.1922882
Vemos que el resultado sigue siendo bastante malo, ya que los puntos son muy homogéneos y no se aprecian grupos. Aunque el ruido prácticamente ha desaparecido, como no hay grupos claramente espaciados, se forma un único clúster demasiado grande, lo cual hace que baje también la calidad del modelo, dando lugar a un valor de silueta bajo ya que la distancia entre puntos de un mismo cluster se eleva.
table(res$cluster)
##
## 0 1
## 3 470
Mediante la función table(), utilizada para contar la frecuencia de cada valor de un vector, observamos que hay 3 puntos sin clasificar (cluster 0) y 470 en el cluster 1.
Para poder profundizar más en este algoritmo, vamos a buscar el mejor valor de épsilon que genere al menos 2 clústeres:
resultados <- rep(0, 45)
colores <- rep(0, 45)
eps = seq(50,95,by=1)
max_val <- c(-1,-1) # pareja épsilon - silueta
for (i in 1:45)
{
res <- extractDBSCAN(res, eps_cl = eps[i])
d <- daisy(data)
sk <- silhouette(res$cluster, d)
resultados[i] <- mean(sk[,3])
# Si tiene 2 o más clústers
if (max(res$cluster >= 2)){
# Punto de color verde
colores[i] <- "green"
# Compruebo que mejora al mejor valor de epsilon hasta el momento
if (mean(sk[,3]) > max_val[2]){
# Pinto de verde el antiguo mejor
colores[max_val[1]] <- "green"
# Reemplazo el mejor
max_val <- c(i, mean(sk[,3]))
# El mejor lo pinto de azul
colores[i] <- "blue"
}
}
# Si no
else{
# Punto de color rojo
colores[i] <- "red"
}
}
# Pinto el primer punto de negro para que las líneas sean de color negro
colores[1] <- "black"
# Muestro la evolución del valor promedio de la silueta
plot(51:95,resultados,type="o",col=colores,pch=0,xlab="Número de clusters",ylab="silhouette")
# "bottomright" es la posición donde se mostrará la leyenda,
# "legend" es el vector de etiquetas de cada clúster
# "col" es el vector de colores correspondientes a cada etiqueta
# "pch" es el estilo de marcador.
legend("bottomright", legend = c("2 o más clústers", "1 único clúster", "Mejor eps"), col = c("green","red", "blue"), pch=16)
# Reemplazo el índice de la posición del mejor épsilon en el vector eps por su valor
max_val[1] <- eps[max_val[1]]
# Muestro el valor óptimo de épsilon para 2 o más clústers y su valor promedio de silueta
print(max_val)
## [1] 78.00000000 0.09965908
Vemos que el mejor valor entero posible de épsilon es 78, el cual da como resultado un valor promedio de silueta de 0.09965908. Ahora profundizaremos en ello. Además, apreciamos que para valores de épsilon superiores a 80, se alcanza un agrupamiento con un único clúster.
res <- extractDBSCAN(res, eps_cl = 78)
res
## OPTICS ordering/clustering for 473 objects.
## Parameters: minPts = 10, eps = 130.094433618848, eps_cl = 78, xi = NA
## The clustering contains 2 cluster(s) and 44 noise points.
##
## 0 1 2
## 44 417 12
##
## Available fields: order, reachdist, coredist, predecessor, minPts, eps,
## eps_cl, xi, cluster
plot(res)
hullplot(data, res)
Vemos que 44 puntos han sido clasificados como ruido, mientras que el resto se reparten en 2 clústers, 417 en el clúster 1, y 12 en el clúster 2.
A continuación, comparamos las agrupaciones obtenidas con la clasificación real. Al igual que en ejercicios anteriores, vamos a calcular la exactitud del modelo, en este caso. Para ello, debemos discretizar la variable “sal” en dos rangos de salario y asignamos cada clúster a un rango de salario.
En este caso, no vamos a separar los datos en dos grupos de mismo tamaño, sino que haremos un grupo de 417 puntos, y otro de 12.
En primer lugar agruparemos los 12 registros con menos salario y los otros 417, y posteriormente lo haremos al revés, separando los 12 registros con más salario por un lado y el resto por otro, para ver cual de las dos agrupaciones se ajusta mejor a la clusterización realizada por el modelo.
# Recupero la variable "sal" de cada registro
data$sal <- na.omit(dataAux)$sal
# Añado la columna cluster y elimino los registros clasificados como ruido
data$cluster <- res$cluster
data <- filter(data, cluster != 0)
# Ordeno ascendentemente en función de "sal"
data <- data[order(data$sal),]
# Muestro el valor de corte de los rangos
print(data[12,"sal"])
## [1] 1586
Una vez ordenados los registros, veo que el valor de la fila 12 que marca el límite de los rangos es 1586, por lo tanto, discretizo la variable en dos rangos: [0-1586] y >1586:
# Asigno en cluster 1 a los 12 primeros, y el cluster 2 a los restantes
data$sal2clusters <- as.factor(c(rep("0-1586",12),rep(">1586",nrow(data)-12)))
Asignar el cluster 2 al rango [0-1586] y el cluster 1 al rango >1586.
# Asigna el cluster 1 al rango "0-1586" y el cluster 2 al rango ">1586"
data$predictions <- as.factor(
ifelse(data$cluster == 2, "0-1586",
ifelse(data$cluster == 1, ">1586","NA")))
head(data)
## Longitude Latitude minExp maxExp numeric.Job.Title numeric.Key.Skills
## 195 73.85445 18.52143 0 5 274 172
## 429 76.13065 22.54142 2 5 401 287
## 13 80.27019 13.08369 0 1 444 185
## 427 78.47406 17.36059 4 9 386 431
## 52 72.87739 19.07599 2 5 262 440
## 327 77.59008 12.97679 1 6 169 267
## numeric.Role.Category numeric.Location numeric.Functional.Area
## 195 35 98 13
## 429 60 81 26
## 13 1 35 31
## 427 39 79 15
## 52 4 84 16
## 327 4 16 15
## numeric.Industry numeric.Role sal cluster sal2clusters predictions
## 195 44 72 1510 1 0-1586 >1586
## 429 32 7 1511 1 0-1586 >1586
## 13 38 71 1513 1 0-1586 >1586
## 427 32 110 1515 1 0-1586 >1586
## 52 32 26 1528 1 0-1586 >1586
## 327 18 116 1542 1 0-1586 >1586
Finalmente, calculamos el porcentaje de aciertos.
exactitud <- sum(data$sal2clusters == data$predictions)/nrow(data)
print(exactitud)
## [1] 0.9440559
Con esta división, el modelo clasifica correctamente únicamente el 94,4% de los datos, un resultado, a priori, bastante bueno. Para verificar la calidad del modelo, vamos a calcular otras métricas. Dado que se trata de un problema binario, podemos utilizar métricas como sensibilidad, precision y F-measure. Para ello, cabe destacar los siguientes conceptos:
Verdaderos Positivos (TP - True Positive): puntos clasificados como positivos que son.
Falsos Positivos (FP - False Positive): puntos clasificados como que son negativos.
Verdaderos Negativos (TN - True Negative): puntos clasificados como negativos que son negativos.
Falsos Negativos (FN - False Negative): puntos clasificados como negativos que son positivos.
Sensibilidad: También se conoce como Tasa de Verdaderos Positivos (True Positive Rate) ó recall. Es la proporción de casos positivos que fueron correctamente identificados por el algoritmo. Se calcula como: \(\frac{TP}{TP+FN}\).
Precisión: También llamada valor de la predicción positiva, se refiere a la dispersión del conjunto de valores obtenidos a partir de mediciones repetidas de una magnitud. Cuanto menor es la dispersión mayor la precisión. Se representa por la proporción de verdaderos positivos dividido entre todos los resultados positivos: \(\frac{TP}{TP+FP}\).
especificidad: También conocida como tasa de verdaderos negativos, se refiere a cuántas veces el modelo clasificó correctamente a una clase específica cuando esa clase no estaba presente. Se calcula como: \(\frac{TN}{TN+FP}\)
F-measure: Combina la precisión y sensibilidad en una sola métrica. Se calcula como: \(2 * \frac{Precision * Sensibilidad}{Precision + Sensibilidad}\)
En este caso, definimos positivo como “>1586” (el criterio es que son la mayoría de registros) y negativo como “0-1586).
# Calcular TP, FP, TN y FN
# Para ello filtro la tabla por los valores explicados
# anteriormente y almaceno el número de filas resultante
TP <- nrow(filter(data, predictions==">1586" & sal2clusters==">1586"))
FP <- nrow(filter(data, predictions==">1586" & sal2clusters=="0-1586"))
TN <- nrow(filter(data, predictions=="0-1586" & sal2clusters=="0-1586"))
FN <- nrow(filter(data, predictions=="0-1586" & sal2clusters==">1586"))
# Meto todas las métricas en una tabla
metrics <- data.frame(TP=TP, FP=FP, TN=TN, FN=FN)
# Calcular sensibilidad, precisión y especificidad
metrics$sensibilidad <- c(TP/(TP+FN))
metrics$precision <- c(TP/(TP+FP))
metrics$especificidad <- c(TN/(TN+FP))
metrics$f_measure <- c(2*(metrics$precision*metrics$sensibilidad)/(metrics$precision+metrics$sensibilidad))
metrics$exactitud <- c(mean(data$predictions == data$sal2clusters))
print(metrics)
## TP FP TN FN sensibilidad precision especificidad f_measure exactitud
## 1 405 12 0 12 0.971223 0.971223 0 0.971223 0.9440559
Como era de esperar, el algoritmo es bueno detecando valores en el rango >1586 (97,12% de sensibilidad y precisión), pero muy malo para detectar valores en el rango [0-1586] (0% de especificidad). No obstante, el modelo logra un buen resultado en general (97,12% de f-measure y 94,4% de exactitud), ya que la mayoría de registros en el juego de datos se encuentran en el rango >1586, aunque esto no implica que el modelo sea bueno, ya que si se reciben datos de entrada que deban ser clasificados en el rango [0,1586], estos serán mal clasificados con una alta probabilidad.
A continuación, repetimos este proceso, pero agrupando por un lado los 12 registros con mayor salario en un clúster, y el resto en otro clúster.
# Ordeno descendentemente en función de "sal"
data <- data[order(data$sal,decreasing=TRUE),]
# Muestro el valor de corte de los rangos
print(data[12,"sal"])
## [1] 6744
En esta ocasión, una vez ordenados los registros, vemos que el valor de la fila 12 que marca el límite de los rangos es 6744, por lo tanto, discretizo la variable en dos rangos: >6744 y [0-6744]:
# Asigno en cluster 1 a los 12 primeros, y el cluster 2 a los restantes
data$sal2clusters <- as.factor(c(rep(">6744",12),rep("0-6744",nrow(data)-12)))
Asignar el cluster 1 al rango >6744 y el cluster 2 al rango [0-6744].
# Asigna el cluster 2 al rango ">6744" y el cluster 1 al rango "0-6744"
data$predictions <- as.factor(
ifelse(data$cluster == 2, ">6744",
ifelse(data$cluster == 1, "0-6744","NA")))
Finalmente, calculamos el porcentaje de aciertos.
exactitud <- sum(data$sal2clusters == data$predictions)/nrow(data)
print(exactitud)
## [1] 0.9440559
# Calcular TP, FP, TN y FN
# Para ello filtro la tabla por los valores explicados
# anteriormente y almaceno el número de filas resultante
TP <- nrow(filter(data, predictions=="0-6744" & sal2clusters=="0-6744"))
FP <- nrow(filter(data, predictions=="0-6744" & sal2clusters==">6744"))
TN <- nrow(filter(data, predictions==">6744" & sal2clusters==">6744"))
FN <- nrow(filter(data, predictions==">6744" & sal2clusters=="0-6744"))
# Meto todas las métricas en una tabla
metrics <- data.frame(TP=TP, FP=FP, TN=TN, FN=FN)
# Calcular sensibilidad, precisión y especificidad
metrics$sensibilidad <- c(TP/(TP+FN))
metrics$precision <- c(TP/(TP+FP))
metrics$especificidad <- c(TN/(TN+FP))
metrics$f_measure <- c(2*(metrics$precision*metrics$sensibilidad)/(metrics$precision+metrics$sensibilidad))
metrics$exactitud <- c(mean(data$predictions == data$sal2clusters))
print(metrics)
## TP FP TN FN sensibilidad precision especificidad f_measure exactitud
## 1 405 12 0 12 0.971223 0.971223 0 0.971223 0.9440559
En este caso, se obtiene el mismo resultado que en el caso anterior, seguramente porque los datos agrupados en el clúster 2 no pertenezcan a ninguno de los extremos en los rangos de salario, por lo que las conclusiones son las mismas. Utilizaremos la agrupación anterior ([0,1586] y >1586) para futuros análisis.
| Modelo | k | Exactitud |
|---|---|---|
| k-means (dist. euclidiana) | 3 4 |
0.3340381 0.2515856 |
| hierarchical clustering (dist. manhattan) | 3 4 |
0.3636364 0.2854123 |
| OPTICS-DBSCAN | 2 | 0.9440559 |
Al utilizar OPTICS y DBSCAN, el modelo se ajusta mucho mejor a los datos, llegando en ocasiones a triplicar el porcentaje de datos bien agrupados. Estos algoritmos permiten la generacion de grupos no radiales, es decir, grupos que pueden tener formas y tamaños variados, lo cual es especialmente útil cuando los datos no se distribuyen de manera esférica, además de que son especialmente buenos identificando outliers.
Los algoritmos k-means y hierarchical clustering, por otro lado, requieren que los datos se distribuyan de manera esférica y se ven afectados por la elección de los parámetros k y la distancia utilizada Tienen problemas para agrupar datos con clústeres condiferentes tamaños y densidades y los centroides se pueden arrastrar por valores atípicos, o bien los valores atípicos pueden obtener su propio clúster en lugar de ignorarlos. En este caso, se puede observar que el uso de OPTICS y DBSCAN resulta en una mayor exactitud en la agrupación de los datos en comparación con los otros algoritmos.
Sin embargo, es importante mencionar que el algoritmo DBSCAN tiene como desventaja que requiere el ajuste de dos parámetros (eps y minPts) para su correcto funcionamiento, estos parámetros son críticos para el rendimiento del algoritmo y su correcta elección puede ser difícil en algunos casos. Es recomendable probar diferentes valores para estos parámetros y evaluar los resultados obtenidos para determinar los mejores ajustes.
Además, es importante tener en cuenta que el rendimiento del algoritmo DBSCAN puede verse afectado por la presencia de ruido o outliers en los datos. Es posible que en algunos casos, los algoritmos k-means y hierarchical clustering puedan ser más robustos a estos tipos de datos.
| Modelo | Sensibilidad | Precision | Especificidad | F_measure | Exactitud |
|---|---|---|---|---|---|
| OPTICS-DBSCAN | 0.971223 | 0.971223 | 0 | 0.971223 | 0.9440559 |
En este caso, debido a la homogeneidad de los datos, DBSCAN genera una clusterización desbalanceada, donde la mayoría de datos se agrupan en un mismo cluster. Por ello, los resultados presentados indican que el modelo DBSCAN tiene una alta tasa de sensibilidad y precisión para detectar valores en el rango >1586, lo cual es esperado ya que este es el rango donde se encuentra la mayoría de los registros en el conjunto de datos. Sin embargo, el modelo tiene una baja tasa de especificidad para detectar valores en el rango [0-1586], lo cual sugiere que este rango de valores es donde el modelo tiene dificultades para clasificar los datos de manera precisa.
A pesar de esto, el modelo logra un buen resultado en general con una f-measure del 97,12% y una exactitud del 94,4%. Sin embargo, es importante tener en cuenta que esto no implica necesariamente que el modelo sea bueno. Esto se debe a que si el modelo recibe datos de entrada que deben ser clasificados en el rango [0-1586], estos serán mal clasificados con una alta probabilidad.
K-means y hierarchical clustering no tienen este problema ya que estos algoritmos generan clústers más equilibrados, aunque con menos precisión.
En resumen, el modelo DBSCAN generado es bueno para detectar valores en el rango >1586 pero tiene dificultades para detectar valores en el rango [0-1586], lo cual es crítico si se espera que el modelo clasifique datos en ambos rangos con precisión. los modelos k-means y hierarchical clustering generados no son tan buenos para detectar valores dentro de un rango, pero son mejores para detectar valores fuera de dicho rango y, además, al agrupar por más clústers y de intervalos parecidos, el problema de pérdida de información no es tan relevante.
OPTICS y DBSCAN son algoritmos de clusterización no supervisada que ofrecen una gran flexibilidad en la detección de patrones y estructuras en los datos, especialmente en situaciones donde los datos no se distribuyen de manera esférica. Estos algoritmos son especialmente útiles para identificar clusters de formas y tamaños variables, lo que los hace ideales para aplicaciones en las que se requiere la detección de patrones complejos en los datos.
Sin embargo, estos algoritmos también tienen sus limitaciones. En primer lugar, DBSCAN requiere el ajuste de dos parámetros críticos (eps y minPts) para su correcto funcionamiento. La elección incorrecta de estos parámetros puede afectar significativamente el rendimiento del algoritmo y es esencial probar diferentes valores para estos parámetros antes de tomar una decisión sobre cuáles son los mejores ajustes.
En segundo lugar, es importante tener en cuenta que el rendimiento de DBSCAN puede verse afectado por la presencia de ruido u outliers en los datos. En estos casos, es posible que el algoritmo no sea capaz de identificar correctamente los clusters y los resultados pueden ser menos precisos.
Es importante también mencionar que estos algoritmos son complementarios a otros algoritmos de clusterización como k-means y hierarchical clustering. Cada algoritmo tiene sus propias ventajas y limitaciones y es importante evaluar las características de los datos y los objetivos del análisis para determinar cuál es el algoritmo adecuado para utilizar en una situación específica.
En resumen, OPTICS y DBSCAN son algoritmos de clusterización no supervisada que ofrecen una gran flexibilidad en la detección de patrones y estructuras en los datos. Sin embargo, es importante tener en cuenta las limitaciones de estos algoritmos y tomar medidas para abordarlas para obtener resultados precisos y significativos. Es importante también evaluar las características de los datos y los objetivos del análisis para determinar cuál es el algoritmo adecuado para utilizar en una situación específica.
Los datos utilizados están etiquetados por una variable continua, por lo que lo ideal sería aplicar un modelo de regresión. A la hora de generar un modelo no supervisado, estos pueden ser de clustering o de asociación, los cuales no se ajustan bien a variables contínuas.
Para poder convertir un problema de regresión en un problema de clasificación o agrupación, se puede discretizar la variable utilizada para el etiquetado, asignando los datos a distintas agrupaciones, aunque esto también puede presentar problemas como la pérdida de información, el número de valores discretos a generar y la dificultad para establecer una línea de corte adecuada para la discretización. En este caso, los grupos generados no quedan claramente separados en el espacio de los atributos, lo cual supone una gran dificultad para que el modelo pueda crear sus propias agrupaciones y que estas coincidan con la agrupación real a la que pertenece un dato.
Si los datos no tienen una estructura clara o patrones evidentes, puede ser difícil para los modelos no supervisados aprender de ellos y generar conclusiones útiles. En el caso de una variable continua, puede ser difícil para los algoritmos de clustering o agrupamiento encontrar patrones significativos en los datos, ya que no hay etiquetas predefinidas para guiar la separación en grupos. También puede ser difícil para los algoritmos de reducción de dimensionalidad visualizar los datos de manera significativa. Es importante tener una comprensión previa de la estructura de los datos y utilizar técnicas adecuadas para explorarlos antes de aplicar un modelo no supervisado.
Además, existe una dificultad a la hora de evaluar el rendimiento del modelo. Es difícil evaluar el rendimiento de un modelo no supervisado con una variable continua ya que no hay una clasificación verdadera para comparar con las predicciones.
En este ejercicio, vamos a trabajar con árboles de decisión, un tipo de algoritmo que se utiliza con frecuencia para resolver problemas de clasificación y de regresión supervisada en minería de datos debido a su facilidad de interpretación y su buena capacidad de explicación. Estos modelos se pueden emplear tanto en tareas de clasificación como en problemas de regresión supervisados.
Los árboles de decisión tienen como objetivo principal dividir el conjunto de datos de entrada en regiones disjuntas, de manera que todas las muestras pertenecientes a una misma región sean de la misma clase. Si una región incluye muestras de diferentes clases, entonces se divide en regiones más pequeñas siguiendo el mismo principio. Este proceso se detiene cuando se ha dividido el conjunto de datos en regiones en las que todas las muestras pertenecen a una única clase. Un árbol de decisión se considera completo o puro cuando es posible construir un árbol que cumple esta condición.
Un árbol de decisión está compuesto por nodos terminales o hojas, que representan regiones etiquetadas según una clase, y nodos internos o de división, que representan condiciones que permiten decidir a qué subregión va cada elemento que llega a dicho nodo. Cuando se presenta una nueva muestra para ser evaluada por un árbol de decisión, el proceso comienza en el nodo raíz, que contiene una condición que determina por qué rama del árbol debe ir la muestra. Una vez seleccionada la rama, la muestra llegará a otro nodo con otra condición o a un nodo terminal, en cuyo caso se determinará la etiqueta predicha para la muestra basándose en la etiqueta indicada en el nodo terminal.
Nuestro objetivo es crear un árbol de decisión que permita analizar qué salario corresponde a cada trabajador, según las condiciones estudiadas. Para ello, dado que se trata de un modelo supervisado, debemos dividir los datos etiquetados en conjunto de entrenamiento y de test para, posteriormente, crear el árbol de dicisión.
El conjunto de entrenamiento es el subconjunto del conjunto original de datos utilizado para construir un primer modelo; y el conjunto de prueba, el subconjunto del conjunto original de datos utilizado para evaluar la calidad del modelo, lo más correcto será utilizar un conjunto de datos diferente del que utilizamos para construir el árbol, es decir, un conjunto diferente del de entrenamiento.
No hay ninguna proporción fijada con respecto al número relativo de componentes de cada subconjunto, pero la más utilizada acostumbra a ser 2/3 para el conjunto de entrenamiento y 1/3, para el conjunto de prueba.
La variable por la que clasificaremos es el campo “sal”. De esta forma, tendremos un conjunto de datos para el entrenamiento y uno para la validación.
# Recuperamos los datos preprocesados
data <- dataAux
# Eliminamos valores nulos que hayan podido quedar tras el preprocesado
data <- na.omit(data)
# Definimos semilla de aleatoriedad
set.seed(1)
# Separamos la etiqueta del resto de datos
y <- data$sal
X <- data %>% select(-sal)
# Separamos los datos de entrenamiento y test de forma aleatoria
split_prop <- 3
indexes = sample(1:nrow(data), size=floor(((split_prop-1)/split_prop)*nrow(data)))
trainX<-X[indexes,]
trainY<-y[indexes]
testX<-X[-indexes,]
testY<-y[-indexes]
Después de una extracción aleatoria de casos es altamente recomendable efectuar un análisis de datos mínimo para asegurarnos de no obtener clasificadores sesgados por los valores que contiene cada muestra. En este caso, verificaremos que la proporción de datos en cada grupo es más o menos contante en ambos conjuntos:
summary(trainX)
## Longitude Latitude minExp maxExp
## Min. :72.57 Min. :11.93 Min. : 0.000 Min. : 0.000
## 1st Qu.:73.85 1st Qu.:14.67 1st Qu.: 1.000 1st Qu.: 5.000
## Median :77.00 Median :19.08 Median : 2.000 Median : 6.684
## Mean :76.06 Mean :20.30 Mean : 3.345 Mean : 7.002
## 3rd Qu.:77.59 3rd Qu.:23.02 3rd Qu.: 5.000 3rd Qu.: 8.000
## Max. :80.27 Max. :30.74 Max. :15.000 Max. :22.000
## numeric.Job.Title numeric.Key.Skills numeric.Role.Category numeric.Location
## Min. : 1.0 Min. : 3.0 Min. : 1.00 Min. : 1.00
## 1st Qu.:109.5 1st Qu.:125.5 1st Qu.:17.00 1st Qu.: 16.00
## Median :230.0 Median :258.0 Median :39.00 Median : 72.00
## Mean :229.5 Mean :251.1 Mean :33.28 Mean : 59.14
## 3rd Qu.:347.5 3rd Qu.:377.5 3rd Qu.:46.00 3rd Qu.: 84.00
## Max. :472.0 Max. :473.0 Max. :60.00 Max. :101.00
## numeric.Functional.Area numeric.Industry numeric.Role
## Min. : 1.00 Min. : 1.00 Min. : 1.00
## 1st Qu.:15.00 1st Qu.:23.00 1st Qu.: 32.00
## Median :16.00 Median :32.00 Median : 89.00
## Mean :20.35 Mean :28.86 Mean : 72.94
## 3rd Qu.:30.00 3rd Qu.:32.00 3rd Qu.:110.00
## Max. :41.00 Max. :53.00 Max. :138.00
summary(trainY)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1513 2917 4164 4225 5596 6991
summary(testX)
## Longitude Latitude minExp maxExp
## Min. :72.58 Min. :12.98 Min. : 0.000 Min. : 0.000
## 1st Qu.:73.85 1st Qu.:17.36 1st Qu.: 1.000 1st Qu.: 5.000
## Median :77.00 Median :19.08 Median : 2.000 Median : 6.000
## Mean :76.05 Mean :21.06 Mean : 3.386 Mean : 6.829
## 3rd Qu.:77.59 3rd Qu.:28.43 3rd Qu.: 5.000 3rd Qu.: 8.000
## Max. :80.27 Max. :30.73 Max. :15.000 Max. :22.000
## numeric.Job.Title numeric.Key.Skills numeric.Role.Category numeric.Location
## Min. : 1.0 Min. : 1.0 Min. : 1.00 Min. : 1.00
## 1st Qu.:101.2 1st Qu.:119.2 1st Qu.:16.25 1st Qu.: 16.75
## Median :224.5 Median :226.5 Median :39.00 Median : 72.00
## Mean :228.1 Mean :238.6 Mean :32.54 Mean : 57.56
## 3rd Qu.:356.0 3rd Qu.:354.5 3rd Qu.:46.00 3rd Qu.: 84.00
## Max. :464.0 Max. :473.0 Max. :60.00 Max. :102.00
## numeric.Functional.Area numeric.Industry numeric.Role
## Min. : 1.00 Min. : 1.00 Min. : 1.00
## 1st Qu.:15.00 1st Qu.:22.75 1st Qu.: 41.25
## Median :25.50 Median :32.00 Median : 85.50
## Mean :22.63 Mean :29.46 Mean : 74.46
## 3rd Qu.:33.00 3rd Qu.:35.00 3rd Qu.:110.00
## Max. :40.00 Max. :54.00 Max. :139.00
summary(testY)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1510 2726 4481 4263 5742 6937
Verificamos que no haya diferencias graves que puedan sesgar las conclusiones. Vemos que los valores máximos y mínimos así como el valor promedio, la mediana y los cuartiles son similares en ambos conjuntos de datos.
A continuación, se crea el árbol de decisión usando los datos de entrenamiento (no hay que olvidar que la variable outcome es de tipo factor).
trainY <- as.factor(trainY)
model <- C50::C5.0(trainX, trainY, rules=TRUE)
summary(model)
##
## Call:
## C5.0.default(x = trainX, y = trainY, rules = TRUE)
##
##
## C5.0 [Release 2.07 GPL Edition] Wed Jan 25 18:18:08 2023
## -------------------------------
##
## Class specified by attribute `outcome'
##
## Read 315 cases (12 attributes) from undefined.data
##
## Rules:
##
## Rule 1: (9/8, lift 57.3)
## maxExp <= 1
## -> class 1513 [0.182]
##
## Rule 2: (93/92, lift 6.6)
## minExp <= 1
## -> class 1513 [0.021]
##
## Rule 3: (21/20, lift 27.4)
## minExp > 0
## minExp <= 1
## maxExp > 4
## -> class 1542 [0.087]
##
## Rule 4: (30/29, lift 19.7)
## maxExp > 9
## numeric.Role <= 79
## -> class 1558 [0.063]
##
## Rule 5: (5/4, lift 90.0)
## minExp <= 0
## maxExp > 3
## maxExp <= 4
## -> class 1564 [0.286]
##
## Rule 6: (7/6, lift 70.0)
## Longitude <= 73.85683
## maxExp > 6
## maxExp <= 7
## numeric.Role <= 79
## -> class 1565 [0.222]
##
## Rule 7: (6/5, lift 78.8)
## Latitude > 23.02289
## minExp > 0
## minExp <= 1
## maxExp <= 4
## -> class 1567 [0.250]
##
## Rule 8: (2/1, lift 157.5)
## minExp > 6
## numeric.Key.Skills > 268
## numeric.Location > 22
## numeric.Location <= 66
## numeric.Role > 79
## -> class 1571 [0.500]
##
## Rule 9: (3/1, lift 94.5)
## Latitude <= 18.5293
## maxExp > 6
## maxExp <= 10
## numeric.Key.Skills <= 268
## numeric.Role > 119
## -> class 1586 [0.600]
##
## Rule 10: (159/157, lift 2.9)
## maxExp > 6
## -> class 1586 [0.019]
##
## Rule 11: (4/3, lift 105.0)
## Latitude > 19.19433
## minExp > 1
## minExp <= 2
## maxExp <= 6
## numeric.Industry > 37
## -> class 1624 [0.333]
##
## Rule 12: (3/2, lift 126.0)
## Latitude <= 20.67137
## minExp > 0
## minExp <= 1
## maxExp <= 4
## numeric.Industry > 38
## -> class 1637 [0.400]
##
## Rule 13: (4/3, lift 105.0)
## minExp <= 8
## maxExp > 11
## numeric.Functional.Area > 22
## numeric.Role <= 79
## -> class 1724 [0.333]
##
## Rule 14: (8/7, lift 63.0)
## minExp > 10
## numeric.Role <= 79
## -> class 1789 [0.200]
##
## Rule 15: (2/1, lift 157.5)
## minExp > 10
## maxExp > 18
## numeric.Role <= 79
## -> class 1802 [0.500]
##
## Rule 16: (4/3, lift 105.0)
## maxExp > 9
## maxExp <= 11
## numeric.Functional.Area > 22
## numeric.Role <= 79
## -> class 1816 [0.333]
##
## Rule 17: (3/2, lift 126.0)
## maxExp <= 1
## numeric.Functional.Area <= 20
## -> class 1824 [0.400]
##
## Rule 18: (4/3, lift 105.0)
## Latitude <= 20.67137
## minExp > 0
## maxExp <= 2
## -> class 1838 [0.333]
##
## Rule 19: (107/106, lift 5.8)
## maxExp > 7
## -> class 1860 [0.018]
##
## Rule 20: (4/3, lift 105.0)
## minExp <= 1
## maxExp > 4
## maxExp <= 5
## numeric.Industry <= 21
## -> class 1906 [0.333]
##
## Rule 21: (6/5, lift 78.8)
## minExp > 8
## minExp <= 10
## numeric.Role <= 79
## -> class 1933 [0.250]
##
## Rule 22: (44/43, lift 13.7)
## minExp > 0
## minExp <= 1
## -> class 1934 [0.043]
##
## Rule 23: (10/9, lift 52.5)
## minExp <= 0
## maxExp > 1
## maxExp <= 2
## -> class 1946 [0.167]
##
## Rule 24: (2/1, lift 157.5)
## Latitude > 23.02289
## maxExp > 6
## maxExp <= 7
## numeric.Location <= 71
## numeric.Functional.Area > 11
## numeric.Role <= 79
## -> class 1958 [0.500]
##
## Rule 25: (42/40, lift 10.7)
## maxExp > 6
## numeric.Key.Skills > 268
## numeric.Role > 79
## -> class 1965 [0.068]
##
## Rule 26: (3/2, lift 126.0)
## Longitude > 73.85683
## minExp <= 1
## maxExp > 5
## numeric.Job.Title > 264
## -> class 2023 [0.400]
##
## Rule 27: (3/2, lift 126.0)
## Longitude > 77.12122
## Latitude > 20.67137
## minExp > 0
## maxExp <= 4
## -> class 2026 [0.400]
##
## Rule 28: (2/1, lift 157.5)
## Longitude > 77.12122
## Latitude > 23.02289
## maxExp > 6
## numeric.Key.Skills > 268
## numeric.Role > 79
## -> class 2040 [0.500]
##
## Rule 29: (6/5, lift 78.8)
## Longitude > 73.85683
## Latitude > 19.19433
## minExp > 2
## maxExp <= 6
## -> class 2090 [0.250]
##
## Rule 30: (2/1, lift 157.5)
## Longitude <= 73.85683
## minExp > 0
## maxExp <= 2
## -> class 2111 [0.500]
##
## Rule 31: (16/15, lift 35.0)
## Longitude > 73.85683
## minExp > 2
## maxExp <= 6
## -> class 2155 [0.111]
##
## Rule 32: (2/1, lift 157.5)
## Longitude <= 73.85683
## minExp <= 8
## maxExp > 9
## numeric.Job.Title <= 87
## numeric.Role <= 79
## -> class 2171 [0.500]
##
## Rule 33: (14/13, lift 39.4)
## minExp <= 0
## maxExp > 2
## maxExp <= 3
## -> class 2192 [0.125]
##
## Rule 34: (3/2, lift 126.0)
## Longitude <= 76.92638
## maxExp > 7
## numeric.Key.Skills <= 268
## numeric.Functional.Area > 25
## numeric.Role > 79
## -> class 2207 [0.400]
##
## Rule 35: (18/16, lift 23.6)
## Latitude > 18.5293
## maxExp > 6
## numeric.Key.Skills <= 268
## numeric.Role > 79
## -> class 2257 [0.150]
##
## Rule 36: (6/5, lift 78.8)
## Longitude > 73.85683
## Latitude <= 19.19433
## minExp > 2
## maxExp <= 5
## -> class 2265 [0.250]
##
## Rule 37: (16/15, lift 35.0)
## maxExp > 6
## maxExp <= 9
## numeric.Industry > 33
## -> class 2273 [0.111]
##
## Rule 38: (3/2, lift 126.0)
## Longitude <= 73.85683
## Latitude <= 18.5293
## maxExp > 6
## numeric.Key.Skills <= 268
## numeric.Role > 79
## -> class 2274 [0.400]
##
## Rule 39: (12/11, lift 45.0)
## Longitude > 77.67819
## maxExp > 6
## numeric.Key.Skills <= 268
## -> class 2275 [0.143]
##
## Rule 40: (4/3, lift 105.0)
## numeric.Key.Skills > 268
## numeric.Location <= 22
## numeric.Role > 79
## numeric.Role <= 109
## -> class 2387 [0.333]
##
## Rule 41: (3/2, lift 126.0)
## Latitude <= 18.5293
## maxExp > 10
## numeric.Key.Skills <= 268
## numeric.Functional.Area > 16
## numeric.Role > 79
## -> class 2417 [0.400]
##
## Rule 42: (2/1, lift 157.5)
## Longitude <= 72.88177
## minExp <= 0
## maxExp > 1
## maxExp <= 2
## -> class 2453 [0.500]
##
## Rule 43: (98/97, lift 6.3)
## Longitude <= 73.85683
## -> class 2457 [0.020]
##
## Rule 44: (2/1, lift 157.5)
## Longitude > 73.01985
## Longitude <= 73.85683
## minExp > 1
## maxExp <= 4
## numeric.Industry > 30
## -> class 2509 [0.500]
##
## Rule 45: (3/2, lift 126.0)
## minExp > 0
## minExp <= 1
## maxExp > 4
## maxExp <= 5
## numeric.Industry > 35
## -> class 2548 [0.400]
##
## Rule 46: (10/9, lift 52.5)
## maxExp > 6.684
## maxExp <= 9
## numeric.Functional.Area <= 11
## -> class 2555 [0.167]
##
## Rule 47: (6/5, lift 78.8)
## minExp > 3
## maxExp <= 6
## -> class 2647 [0.250]
##
## Rule 48: (5/4, lift 90.0)
## Latitude > 20.67137
## Latitude <= 23.02289
## minExp > 0
## maxExp <= 4
## -> class 2657 [0.286]
##
## Rule 49: (2/1, lift 157.5)
## Latitude > 18.5293
## maxExp > 10
## numeric.Key.Skills <= 268
## numeric.Functional.Area <= 25
## numeric.Role > 79
## -> class 2691 [0.500]
##
## Rule 50: (2/1, lift 157.5)
## minExp > 8
## maxExp <= 14
## numeric.Role <= 79
## -> class 2770 [0.500]
##
## Rule 51: (4/3, lift 105.0)
## maxExp <= 1
## numeric.Role.Category > 47
## -> class 2781 [0.333]
##
## Rule 52: (3/2, lift 126.0)
## Latitude <= 28.46707
## minExp <= 0
## maxExp > 3
## maxExp <= 4
## -> class 2833 [0.400]
##
## Rule 53: (7/6, lift 70.0)
## Longitude > 77.67819
## minExp <= 5
## maxExp > 6
## numeric.Key.Skills <= 268
## -> class 2905 [0.222]
##
## Rule 54: (2/1, lift 157.5)
## Latitude > 28.5061
## minExp > 2
## maxExp <= 6
## -> class 2973 [0.500]
##
## Rule 55: (2/1, lift 157.5)
## Latitude <= 18.5293
## maxExp > 6
## numeric.Key.Skills <= 268
## numeric.Role.Category <= 25
## numeric.Role > 79
## -> class 2977 [0.500]
##
## Rule 56: (3/2, lift 126.0)
## maxExp > 6
## maxExp <= 7
## numeric.Key.Skills <= 268
## numeric.Functional.Area > 31
## numeric.Role > 79
## -> class 2992 [0.400]
##
## Rule 57: (2/1, lift 157.5)
## minExp > 2
## maxExp > 6
## maxExp <= 9
## numeric.Functional.Area <= 11
## -> class 2994 [0.500]
##
## Rule 58: (2/1, lift 157.5)
## Longitude > 73.85683
## Latitude > 19.19433
## Latitude <= 28.5061
## minExp > 2
## maxExp <= 6
## numeric.Job.Title > 185
## -> class 3031 [0.500]
##
## Rule 59: (2/1, lift 157.5)
## Longitude > 73.85683
## Latitude > 19.19433
## minExp > 1
## minExp <= 2
## numeric.Location <= 31
## -> class 3055 [0.500]
##
## Rule 60: (4/3, lift 105.0)
## minExp <= 0
## maxExp > 2
## maxExp <= 3
## numeric.Industry > 21
## numeric.Role <= 24
## -> class 3087 [0.333]
##
## Rule 61: (2/1, lift 157.5)
## Longitude <= 76.65112
## maxExp > 9
## maxExp <= 11
## numeric.Functional.Area > 22
## numeric.Role <= 79
## -> class 3090 [0.500]
##
## Rule 62: (14/13, lift 39.4)
## minExp <= 1
## maxExp > 4
## maxExp <= 5
## -> class 3101 [0.125]
##
## Rule 63: (2/1, lift 157.5)
## Longitude <= 77.67819
## Latitude <= 18.5293
## minExp > 3
## minExp <= 4
## maxExp > 6
## numeric.Functional.Area <= 16
## -> class 3145 [0.500]
##
## Rule 64: (2/1, lift 157.5)
## Longitude > 72.88177
## Longitude <= 73.85683
## maxExp > 6
## maxExp <= 7
## numeric.Functional.Area > 11
## numeric.Role <= 79
## -> class 3170 [0.500]
##
## Rule 65: (7/6, lift 70.0)
## Longitude <= 73.01985
## minExp > 1
## minExp <= 2
## maxExp <= 6
## -> class 3187 [0.222]
##
## Rule 66: (3/2, lift 126.0)
## Longitude <= 73.85683
## Latitude > 20.67137
## minExp > 0
## maxExp <= 4
## -> class 3241 [0.400]
##
## Rule 67: (3/2, lift 126.0)
## Longitude <= 73.85683
## maxExp > 7
## maxExp <= 9
## numeric.Role <= 79
## -> class 3248 [0.400]
##
## Rule 68: (2/1, lift 157.5)
## Longitude <= 73.01985
## Latitude <= 19.1004
## minExp > 1
## minExp <= 2
## maxExp <= 5
## -> class 3252 [0.500]
##
## Rule 69: (2/1, lift 157.5)
## Latitude > 19.19433
## minExp > 1
## maxExp <= 4
## numeric.Functional.Area > 24
## -> class 3304 [0.500]
##
## Rule 70: (84/83, lift 7.3)
## minExp > 4
## -> class 3472 [0.023]
##
## Rule 71: (156/154, lift 3.0)
## maxExp <= 6
## -> class 3523 [0.019]
##
## Rule 72: (2/1, lift 157.5)
## maxExp > 6
## numeric.Key.Skills > 268
## numeric.Key.Skills <= 410
## numeric.Location <= 22
## numeric.Role > 109
## -> class 3584 [0.500]
##
## Rule 73: (3/2, lift 126.0)
## minExp <= 2
## maxExp > 6.684
## numeric.Functional.Area <= 11
## numeric.Role <= 14
## -> class 3634 [0.400]
##
## Rule 74: (3/2, lift 126.0)
## Longitude <= 76.13065
## maxExp > 6
## numeric.Location > 22
## numeric.Location <= 66
## numeric.Role > 79
## -> class 3637 [0.400]
##
## Rule 75: (7/6, lift 70.0)
## Longitude <= 73.85683
## minExp > 2
## minExp <= 3
## maxExp <= 6
## -> class 3675 [0.222]
##
## Rule 76: (84/83, lift 7.3)
## minExp > 4
## -> class 3679 [0.023]
##
## Rule 77: (4/3, lift 105.0)
## Longitude > 73.85683
## Latitude <= 19.19433
## minExp > 2
## maxExp <= 5
## numeric.Role.Category > 28
## -> class 3683 [0.333]
##
## Rule 78: (14/13, lift 39.4)
## Latitude > 23.02289
## maxExp > 6
## maxExp <= 7
## -> class 3707 [0.125]
##
## Rule 79: (9/8, lift 57.3)
## maxExp > 6
## maxExp <= 6.684
## numeric.Functional.Area <= 11
## -> class 3764 [0.182]
##
## Rule 80: (2/1, lift 157.5)
## Longitude > 76.77972
## minExp <= 8
## maxExp > 9
## numeric.Functional.Area <= 22
## numeric.Role <= 79
## -> class 3893 [0.500]
##
## Rule 81: (5/4, lift 90.0)
## Longitude <= 73.85683
## minExp > 1
## minExp <= 2
## maxExp <= 6
## numeric.Industry <= 30
## -> class 3930 [0.286]
##
## Rule 82: (3/2, lift 126.0)
## minExp <= 0
## maxExp > 2
## maxExp <= 3
## numeric.Industry > 33
## -> class 3934 [0.400]
##
## Rule 83: (10/9, lift 52.5)
## maxExp > 6
## numeric.Key.Skills > 268
## numeric.Location > 86
## -> class 3944 [0.167]
##
## Rule 84: (2/1, lift 157.5)
## Longitude <= 73.85683
## Latitude > 19.1004
## minExp > 1
## minExp <= 2
## maxExp <= 6
## -> class 3948 [0.500]
##
## Rule 85: (2/1, lift 157.5)
## maxExp > 6
## numeric.Key.Skills > 459
## numeric.Key.Skills <= 471
## numeric.Functional.Area <= 11
## -> class 4015 [0.500]
##
## Rule 86: (4/3, lift 105.0)
## minExp <= 0
## maxExp > 2
## maxExp <= 3
## numeric.Industry <= 33
## numeric.Role > 24
## -> class 4066 [0.333]
##
## Rule 87: (2/1, lift 157.5)
## Longitude > 76.77972
## minExp <= 8
## maxExp > 11
## numeric.Functional.Area > 22
## numeric.Role <= 79
## -> class 4304 [0.500]
##
## Rule 88: (2/1, lift 157.5)
## Latitude > 19.19433
## minExp > 1
## minExp <= 2
## maxExp <= 4
## numeric.Industry > 37
## -> class 4307 [0.500]
##
## Rule 89: (3/2, lift 126.0)
## Longitude <= 73.85683
## minExp > 2
## minExp <= 3
## maxExp <= 6
## numeric.Functional.Area <= 16
## -> class 4403 [0.400]
##
## Rule 90: (3/2, lift 126.0)
## Longitude > 73.85683
## Longitude <= 76.13065
## maxExp > 1
## maxExp <= 2
## -> class 4466 [0.400]
##
## Rule 91: (2/1, lift 157.5)
## Longitude > 77.67819
## minExp > 2
## maxExp <= 5
## -> class 4535 [0.500]
##
## Rule 92: (4/3, lift 105.0)
## Longitude <= 73.85683
## minExp <= 8
## maxExp > 9
## numeric.Functional.Area <= 22
## numeric.Role <= 79
## -> class 4555 [0.333]
##
## Rule 93: (2/1, lift 157.5)
## minExp > 2.786
## maxExp > 6
## maxExp <= 7
## numeric.Location > 71
## numeric.Functional.Area > 11
## numeric.Role <= 79
## -> class 4560 [0.500]
##
## Rule 94: (5/4, lift 90.0)
## Longitude > 77.67819
## maxExp > 6
## maxExp <= 9
## numeric.Key.Skills <= 268
## -> class 4562 [0.286]
##
## Rule 95: (2/1, lift 157.5)
## Longitude > 77.22194
## minExp > 8
## minExp <= 10
## numeric.Role <= 79
## -> class 4563 [0.500]
##
## Rule 96: (2/1, lift 157.5)
## Longitude > 77.33275
## numeric.Key.Skills > 268
## numeric.Location <= 66
## numeric.Role > 79
## numeric.Role <= 109
## -> class 4639 [0.500]
##
## Rule 97: (5/4, lift 90.0)
## maxExp > 6
## maxExp <= 6.684
## numeric.Key.Skills > 471
## -> class 4662 [0.286]
##
## Rule 98: (2/1, lift 157.5)
## Longitude <= 73.85445
## minExp > 10
## numeric.Role <= 79
## -> class 4683 [0.500]
##
## Rule 99: (2/1, lift 157.5)
## minExp > 10
## maxExp <= 18
## numeric.Location <= 46
## numeric.Role <= 79
## -> class 4754 [0.500]
##
## Rule 100: (4/3, lift 105.0)
## Longitude <= 73.85683
## minExp <= 1
## maxExp > 5
## -> class 4855 [0.333]
##
## Rule 101: (2/1, lift 157.5)
## maxExp > 6
## numeric.Key.Skills > 268
## numeric.Location <= 66
## numeric.Industry > 40
## numeric.Role > 109
## -> class 4927 [0.500]
##
## Rule 102: (72/70, lift 6.4)
## maxExp > 6
## numeric.Role <= 79
## -> class 4963 [0.041]
##
## Rule 103: (2/1, lift 157.5)
## minExp <= 0
## maxExp > 4
## maxExp <= 6
## -> class 4992 [0.500]
##
## Rule 104: (2/1, lift 157.5)
## Longitude <= 72.5797
## minExp <= 1
## maxExp > 4
## -> class 5060 [0.500]
##
## Rule 105: (3/2, lift 126.0)
## numeric.Location <= 7
## numeric.Role > 109
## -> class 5170 [0.400]
##
## Rule 106: (2/1, lift 157.5)
## Longitude > 77.67819
## minExp > 2
## maxExp > 5
## maxExp <= 6
## -> class 5419 [0.500]
##
## Rule 107: (2/1, lift 157.5)
## Longitude > 77.32711
## minExp <= 0
## maxExp > 2
## maxExp <= 3
## numeric.Role > 24
## -> class 5518 [0.500]
##
## Rule 108: (2/1, lift 157.5)
## Latitude <= 20.67137
## maxExp <= 1
## numeric.Role.Category > 47
## -> class 5541 [0.500]
##
## Rule 109: (3/2, lift 126.0)
## Longitude > 73.85683
## Latitude <= 19.19433
## minExp > 1
## minExp <= 2
## maxExp <= 4
## -> class 5554 [0.400]
##
## Rule 110: (3/2, lift 126.0)
## minExp > 3
## maxExp <= 5
## -> class 5698 [0.400]
##
## Rule 111: (2/1, lift 157.5)
## Longitude <= 73.85683
## minExp > 1
## minExp <= 2
## maxExp <= 6
## numeric.Functional.Area > 29
## numeric.Industry <= 30
## -> class 5736 [0.500]
##
## Rule 112: (2/1, lift 157.5)
## minExp <= 0
## maxExp > 2
## numeric.Job.Title > 406
## numeric.Role <= 24
## -> class 5972 [0.500]
##
## Rule 113: (2/1, lift 157.5)
## Longitude <= 73.85683
## minExp > 2
## minExp <= 3
## numeric.Role.Category > 42
## -> class 6352 [0.500]
##
## Rule 114: (2/1, lift 157.5)
## Longitude > 72.88177
## Longitude <= 73.85683
## minExp <= 0
## maxExp > 1
## maxExp <= 2
## -> class 6374 [0.500]
##
## Default class: 1586
##
##
## Evaluation on training data (315 cases):
##
## Rules
## ----------------
## No Errors
##
## 114 200(63.5%) <<
##
##
## Class Cases False False
## Pos Neg
## ----- ----- ----- -----
## 1513 1 1 0
## 1515 1 0 1
## 1542 1 1 0
## 1558 1 1 0
## 1564 1 1 0
## 1565 1 3 0
## 1567 1 2 0
## 1571 1 1 0
## 1586 2 3 0
## 1624 1 1 0
## 1637 1 2 0
## 1670 1 0 1
## 1702 1 0 1
## 1724 1 1 0
## 1789 1 1 0
## 1802 1 1 0
## 1816 1 1 0
## 1824 1 2 0
## 1834 1 0 1
## 1838 1 1 0
## 1860 1 0 1
## 1874 1 0 1
## 1889 1 0 1
## 1900 1 0 1
## 1906 1 3 0
## 1915 1 0 1
## 1933 1 1 0
## 1934 1 4 0
## 1946 1 2 0
## 1958 1 1 0
## 1965 2 16 0
## 2023 1 2 0
## 2026 1 2 0
## 2040 1 1 0
## 2063 1 0 1
## 2074 1 0 1
## 2090 1 1 0
## 2111 1 1 0
## 2155 1 1 0
## 2167 1 0 1
## 2171 1 1 0
## 2192 1 2 0
## 2207 1 1 0
## 2257 2 8 0
## 2265 1 1 0
## 2273 1 2 0
## 2274 1 1 0
## 2275 1 1 0
## 2293 1 0 1
## 2302 1 0 1
## 2385 1 0 1
## 2387 1 1 0
## 2417 1 1 0
## 2453 1 1 0
## 2457 1 2 0
## 2459 1 0 1
## 2509 1 1 0
## 2522 1 0 1
## 2548 1 2 0
## 2555 1 3 0
## 2591 1 0 1
## 2639 1 0 1
## 2647 1 2 0
## 2657 1 1 0
## 2662 1 0 1
## 2691 1 1 0
## 2711 1 0 1
## 2739 1 0 1
## 2750 1 0 1
## 2770 1 1 0
## 2781 1 1 0
## 2821 1 0 1
## 2833 1 2 0
## 2867 1 0 1
## 2897 1 0 1
## 2905 1 1 0
## 2929 1 0 1
## 2973 1 1 0
## 2977 1 1 0
## 2992 1 2 0
## 2994 1 1 0
## 3009 1 0 1
## 3031 1 1 0
## 3055 1 1 0
## 3076 1 0 1
## 3087 1 1 0
## 3090 1 1 0
## 3091 1 0 1
## 3101 1 4 0
## 3145 1 1 0
## 3159 1 0 1
## 3170 1 1 0
## 3180 1 0 1
## 3186 1 0 1
## 3187 1 2 0
## 3203 1 0 1
## 3214 1 0 1
## 3241 1 2 0
## 3248 1 2 0
## 3252 1 1 0
## 3290 1 0 1
## 3304 1 1 0
## 3387 1 0 1
## 3408 1 0 1
## 3410 1 0 1
## 3419 1 0 1
## 3472 1 4 0
## 3515 1 0 1
## 3523 2 13 0
## 3541 1 0 1
## 3584 1 1 0
## 3588 1 0 1
## 3634 1 2 0
## 3637 1 1 0
## 3638 1 0 1
## 3668 1 0 1
## 3675 1 1 0
## 3676 1 0 1
## 3679 1 0 1
## 3683 1 1 0
## 3702 1 0 1
## 3707 1 3 0
## 3724 1 0 1
## 3753 1 0 1
## 3759 1 0 1
## 3764 1 1 0
## 3804 1 0 1
## 3807 1 0 1
## 3816 1 0 1
## 3855 1 0 1
## 3893 1 1 0
## 3895 1 0 1
## 3930 1 2 0
## 3934 1 2 0
## 3935 2 0 2
## 3944 1 4 0
## 3948 1 1 0
## 3991 1 0 1
## 4015 1 1 0
## 4016 1 0 1
## 4041 1 0 1
## 4045 1 0 1
## 4066 1 1 0
## 4087 1 0 1
## 4098 1 0 1
## 4106 2 0 2
## 4127 1 0 1
## 4146 1 0 1
## 4154 1 0 1
## 4160 1 0 1
## 4162 1 0 1
## 4164 1 0 1
## 4185 1 0 1
## 4199 1 0 1
## 4227 1 0 1
## 4235 1 0 1
## 4291 1 0 1
## 4304 1 1 0
## 4307 1 1 0
## 4353 1 0 1
## 4379 1 0 1
## 4403 1 2 0
## 4428 1 0 1
## 4436 1 0 1
## 4450 1 0 1
## 4462 1 0 1
## 4466 1 2 0
## 4535 1 1 0
## 4555 1 1 0
## 4560 1 1 0
## 4562 1 3 0
## 4563 1 1 0
## 4565 1 0 1
## 4615 1 0 1
## 4626 1 0 1
## 4639 1 1 0
## 4642 1 0 1
## 4662 1 4 0
## 4664 1 0 1
## 4683 1 1 0
## 4689 1 0 1
## 4707 1 0 1
## 4754 1 1 0
## 4807 1 0 1
## 4855 1 1 0
## 4859 1 0 1
## 4874 1 0 1
## 4877 1 0 1
## 4897 1 0 1
## 4922 1 0 1
## 4927 1 1 0
## 4963 2 6 0
## 4974 1 0 1
## 4992 1 1 0
## 4995 1 0 1
## 5049 1 0 1
## 5060 1 1 0
## 5066 1 0 1
## 5099 1 0 1
## 5115 1 0 1
## 5150 1 0 1
## 5156 1 0 1
## 5161 1 0 1
## 5162 1 0 1
## 5170 1 2 0
## 5173 1 0 1
## 5195 1 0 1
## 5198 1 0 1
## 5227 1 0 1
## 5256 1 0 1
## 5273 1 0 1
## 5279 1 0 1
## 5286 1 0 1
## 5330 1 0 1
## 5338 1 0 1
## 5386 1 0 1
## 5419 1 1 0
## 5421 1 0 1
## 5425 1 0 1
## 5434 1 0 1
## 5467 1 0 1
## 5477 1 0 1
## 5509 1 0 1
## 5518 1 1 0
## 5520 1 0 1
## 5525 1 0 1
## 5541 1 1 0
## 5554 1 2 0
## 5581 1 0 1
## 5611 1 0 1
## 5617 1 0 1
## 5622 1 0 1
## 5623 1 0 1
## 5664 1 0 1
## 5681 1 0 1
## 5684 1 0 1
## 5698 1 2 0
## 5736 1 1 0
## 5757 1 0 1
## 5777 1 0 1
## 5791 1 0 1
## 5800 1 0 1
## 5805 1 0 1
## 5809 1 0 1
## 5816 1 0 1
## 5829 2 0 2
## 5866 1 0 1
## 5901 1 0 1
## 5972 1 1 0
## 5975 1 0 1
## 5994 1 0 1
## 6003 1 0 1
## 6053 1 0 1
## 6063 1 0 1
## 6069 1 0 1
## 6096 1 0 1
## 6176 1 0 1
## 6184 1 0 1
## 6185 1 0 1
## 6213 1 0 1
## 6228 1 0 1
## 6234 1 0 1
## 6256 1 0 1
## 6272 1 0 1
## 6276 2 0 2
## 6305 1 0 1
## 6310 1 0 1
## 6330 1 0 1
## 6352 1 1 0
## 6366 1 0 1
## 6372 1 0 1
## 6374 1 1 0
## 6376 1 0 1
## 6377 1 0 1
## 6397 1 0 1
## 6408 1 0 1
## 6411 1 0 1
## 6417 1 0 1
## 6420 1 0 1
## 6431 1 0 1
## 6436 1 0 1
## 6440 1 0 1
## 6449 1 0 1
## 6454 1 0 1
## 6458 1 0 1
## 6466 1 0 1
## 6493 1 0 1
## 6496 1 0 1
## 6509 1 0 1
## 6571 1 0 1
## 6591 1 0 1
## 6616 1 0 1
## 6622 1 0 1
## 6630 1 0 1
## 6631 1 0 1
## 6666 1 0 1
## 6677 1 0 1
## 6744 2 0 2
## 6753 1 0 1
## 6757 1 0 1
## 6823 1 0 1
## 6851 1 0 1
## 6944 1 0 1
## 6979 1 0 1
## 6991 1 0 1
##
##
## Attribute usage:
##
## 100.00% maxExp
## 76.51% minExp
## 49.84% Longitude
## 47.30% numeric.Role
## 29.21% numeric.Key.Skills
## 28.89% Latitude
## 19.68% numeric.Functional.Area
## 15.24% numeric.Industry
## 10.48% numeric.Location
## 3.81% numeric.Role.Category
## 2.86% numeric.Job.Title
##
##
## Time: 0.1 secs
Errors muestra el número y porcentaje de casos mal clasificados en el subconjunto de entrenamiento. El árbol obtenido clasifica erróneamente 200 de los 315 datos de entrenamiento, una tasa de error del 63,5%.
Este resultado tan malo se debe a la alta complejidad de este problema de regresión. Para solventar esto, vamos a simplificar el problema convirtiéndolo en un problema de clasificiación discretizando la variable objetivo, con los pros y contras que ello conlleva, y que se han mencionado anteriormente.
En este caso, vamos a utilizar la discretización en 4 grupos del mismo tamaño, evitando perder la mayor cantidad de información posible, sin aumentar demasiado la complejidad del modelo.
# Reemplazamos la variable objetivo por su valor discretizado
data$sal <- sal3clusters
# Definimos semilla de aleatoriedad
set.seed(284)
# Separamos la etiqueta del resto de datos
y <- data$sal
X <- data %>% select(-sal)
# Separamos los datos de entrenamiento y test de forma aleatoria
split_prop <- 3
indexes = sample(1:nrow(data), size=floor(((split_prop-1)/split_prop)*nrow(data)))
trainX<-X[indexes,]
trainY<-y[indexes]
testX<-X[-indexes,]
testY<-y[-indexes]
Verificaremos que la proporción de datos en cada grupo es más o menos contante en ambos conjuntos:
summary(trainX)
## Longitude Latitude minExp maxExp
## Min. :72.58 Min. :11.93 Min. : 0.000 Min. : 0.000
## 1st Qu.:73.85 1st Qu.:17.36 1st Qu.: 1.000 1st Qu.: 5.000
## Median :77.00 Median :19.08 Median : 2.000 Median : 6.000
## Mean :75.89 Mean :20.44 Mean : 3.348 Mean : 6.939
## 3rd Qu.:77.59 3rd Qu.:23.02 3rd Qu.: 5.000 3rd Qu.: 8.000
## Max. :80.27 Max. :30.73 Max. :15.000 Max. :20.000
## numeric.Job.Title numeric.Key.Skills numeric.Role.Category numeric.Location
## Min. : 1.0 Min. : 3.0 Min. : 1.00 Min. : 1.00
## 1st Qu.:106.5 1st Qu.:130.0 1st Qu.:16.00 1st Qu.: 16.00
## Median :216.0 Median :249.0 Median :39.00 Median : 72.00
## Mean :227.5 Mean :247.0 Mean :32.58 Mean : 59.49
## 3rd Qu.:351.0 3rd Qu.:366.5 3rd Qu.:46.00 3rd Qu.: 84.00
## Max. :472.0 Max. :473.0 Max. :60.00 Max. :102.00
## numeric.Functional.Area numeric.Industry numeric.Role
## Min. : 1.00 Min. : 1.00 Min. : 1.0
## 1st Qu.:15.00 1st Qu.:23.00 1st Qu.: 35.0
## Median :19.00 Median :32.00 Median : 87.0
## Mean :21.14 Mean :28.99 Mean : 73.3
## 3rd Qu.:31.00 3rd Qu.:33.50 3rd Qu.:110.0
## Max. :40.00 Max. :54.00 Max. :139.0
summary(trainY)
## 0-3251 3252-5164 >5164
## 107 92 116
summary(testX)
## Longitude Latitude minExp maxExp
## Min. :72.57 Min. :12.93 Min. : 0.00 Min. : 0.000
## 1st Qu.:73.87 1st Qu.:14.67 1st Qu.: 1.00 1st Qu.: 4.000
## Median :77.12 Median :19.08 Median : 2.00 Median : 6.684
## Mean :76.38 Mean :20.79 Mean : 3.38 Mean : 6.954
## 3rd Qu.:77.59 3rd Qu.:28.43 3rd Qu.: 5.00 3rd Qu.: 8.000
## Max. :80.27 Max. :30.74 Max. :15.00 Max. :22.000
## numeric.Job.Title numeric.Key.Skills numeric.Role.Category numeric.Location
## Min. : 1.0 Min. : 1.0 Min. : 1.00 Min. : 1.00
## 1st Qu.:106.2 1st Qu.:116.2 1st Qu.:25.00 1st Qu.: 21.75
## Median :249.5 Median :241.5 Median :39.00 Median : 72.00
## Mean :232.2 Mean :246.6 Mean :33.92 Mean : 56.86
## 3rd Qu.:347.5 3rd Qu.:385.8 3rd Qu.:46.00 3rd Qu.: 84.00
## Max. :471.0 Max. :473.0 Max. :60.00 Max. :100.00
## numeric.Functional.Area numeric.Industry numeric.Role
## Min. : 1.00 Min. : 1.00 Min. : 1.00
## 1st Qu.:15.00 1st Qu.:19.25 1st Qu.: 36.00
## Median :18.00 Median :32.00 Median : 92.50
## Mean :21.05 Mean :29.20 Mean : 73.75
## 3rd Qu.:31.00 3rd Qu.:34.00 3rd Qu.:110.00
## Max. :41.00 Max. :53.00 Max. :130.00
summary(testY)
## 0-3251 3252-5164 >5164
## 49 60 49
Vemos fácilmente que no hay diferencias graves que puedan sesgar las conclusiones.
Creamos el nuevo árbol de decisión:
trainY <- as.factor(trainY)
model <- C50::C5.0(trainX, trainY,rules=TRUE)
summary(model)
##
## Call:
## C5.0.default(x = trainX, y = trainY, rules = TRUE)
##
##
## C5.0 [Release 2.07 GPL Edition] Wed Jan 25 18:18:09 2023
## -------------------------------
##
## Class specified by attribute `outcome'
##
## Read 315 cases (12 attributes) from undefined.data
##
## Rules:
##
## Rule 1: (6, lift 2.6)
## Longitude <= 77.63704
## Latitude > 13.02333
## minExp > 8
## minExp <= 11
## -> class 0-3251 [0.875]
##
## Rule 2: (6, lift 2.6)
## Longitude > 73.85683
## numeric.Location > 26
## numeric.Functional.Area > 36
## -> class 0-3251 [0.875]
##
## Rule 3: (5, lift 2.5)
## Longitude <= 73.85683
## numeric.Key.Skills > 439
## -> class 0-3251 [0.857]
##
## Rule 4: (8/1, lift 2.4)
## numeric.Job.Title > 281
## numeric.Job.Title <= 415
## numeric.Role.Category <= 10
## numeric.Functional.Area <= 36
## -> class 0-3251 [0.800]
##
## Rule 5: (7/1, lift 2.3)
## maxExp <= 2
## numeric.Location <= 74
## numeric.Role <= 103
## -> class 0-3251 [0.778]
##
## Rule 6: (10/3, lift 2.0)
## Longitude > 73.85683
## numeric.Functional.Area > 36
## -> class 0-3251 [0.667]
##
## Rule 7: (19/8, lift 1.7)
## Latitude > 17.36059
## maxExp <= 2
## -> class 0-3251 [0.571]
##
## Rule 8: (39/20, lift 1.4)
## numeric.Role > 113
## -> class 0-3251 [0.488]
##
## Rule 9: (10, lift 3.1)
## Longitude <= 73.85683
## numeric.Job.Title > 281
## numeric.Job.Title <= 415
## numeric.Key.Skills > 259
## numeric.Role.Category > 10
## -> class 3252-5164 [0.917]
##
## Rule 10: (6, lift 3.0)
## Latitude <= 13.02333
## maxExp > 2
## numeric.Functional.Area <= 14
## numeric.Role <= 113
## -> class 3252-5164 [0.875]
##
## Rule 11: (3, lift 2.7)
## Longitude > 73.85683
## Longitude <= 76.77972
## maxExp <= 5
## numeric.Industry <= 22
## -> class 3252-5164 [0.800]
##
## Rule 12: (3, lift 2.7)
## Longitude <= 76.77972
## Latitude > 23.02162
## maxExp <= 7
## -> class 3252-5164 [0.800]
##
## Rule 13: (6/1, lift 2.6)
## Longitude <= 73.85683
## minExp > 5
## minExp <= 7
## numeric.Job.Title <= 281
## -> class 3252-5164 [0.750]
##
## Rule 14: (23/10, lift 1.9)
## Longitude <= 73.85683
## numeric.Key.Skills > 176
## numeric.Key.Skills <= 279
## -> class 3252-5164 [0.560]
##
## Rule 15: (244/158, lift 1.2)
## minExp <= 8
## maxExp > 2
## numeric.Functional.Area <= 36
## numeric.Role <= 128
## -> class 3252-5164 [0.354]
##
## Rule 16: (8, lift 2.4)
## minExp <= 0
## maxExp > 1
## maxExp <= 2
## numeric.Location > 74
## -> class >5164 [0.900]
##
## Rule 17: (32/13, lift 1.6)
## Longitude > 73.85683
## numeric.Job.Title > 160
## numeric.Job.Title <= 226
## -> class >5164 [0.588]
##
## Rule 18: (258/158, lift 1.1)
## Latitude > 13.02333
## -> class >5164 [0.388]
##
## Default class: >5164
##
##
## Evaluation on training data (315 cases):
##
## Rules
## ----------------
## No Errors
##
## 18 120(38.1%) <<
##
##
## (a) (b) (c) <-classified as
## ---- ---- ----
## 47 14 46 (a): class 0-3251
## 4 52 36 (b): class 3252-5164
## 12 8 96 (c): class >5164
##
##
## Attribute usage:
##
## 86.98% numeric.Role
## 85.40% maxExp
## 83.81% Latitude
## 81.90% minExp
## 81.90% numeric.Functional.Area
## 27.30% Longitude
## 17.78% numeric.Job.Title
## 11.43% numeric.Key.Skills
## 6.67% numeric.Location
## 5.71% numeric.Role.Category
## 0.95% numeric.Industry
##
##
## Time: 0.0 secs
Discretizando la variable objetivo logramos reducir el número de errores a 111 de los 315 datos de entrenamiento, una tasa de error del 35.2%, además de obtener un árbol bastante más sencillo. Aunque no es un resultado presumiblemente bueno, debido a la homogeneidad de los datos mencionada anteriormente, sí que mejora bastante a lo obtenido hasta ahora.
model <- C50::C5.0(trainX, trainY)
plot(model,gp = gpar(fontsize = 3.5))
Como podemos ver, el árbol es demasiado grande para poder visualizarlo con claridad. Por lo tanto, voy a exportar este plot a una imagen “decision_tree.png” que será incluida en la entrega:
png("decision_tree.png", res=80, height=1200, width=2800)
plot(model,gp = gpar(fontsize = 10))
dev.off()
## png
## 2
A partir del árbol creado, resulta sencillo extraer un conjunto de reglas que ayudan a entender el problema de clasificación. Las reglas podrían resumirse en que se pertenecerá a un rango de salario en función de las siguientes condiciones:
Los empleos con longitud de localización ≤77.02225, al menos un año de experiencia mínima, con identificador de título de trabajo >349, identificador de habilidades >231, identificador de categoría del rol e identificador del área funcional >14, tendrán un salario en el rango [0, 2864] con un 90% de probabilidad.
Los empleos con una latitud de localización ≤ 28.46707, una experiencia máxima de no más de 6 años, un identificador de título de trabajo ≤ 349, un identificador del área funcional >2, un identificador de industria en el rango (43,46] tendrán un salario en el rango [0, 2864] con un 87.5% de probabilidad.
Los empleos con una longitud de localización ≤77.33275, una latitud de localización ≤28.57153, al menos 7 años de experiencia mínima, un identificador de título de trabajo ≤318, e identificador de categoría del rol ≤51 tendrán un salario en el rango [0, 2864] con un 87.5% de probabilidad.
Los empleos con un identificador de título de trabajo >349, un identificador del área funcional ≤9, e identificador de industria ≤46 tendrán un salario en el rango [0, 2864] con un 83.3% de probabilidad.
Los empleos con una latitud de localización ≤28.57153 tendrán un salario en el rango [0, 2864] con un 27.1% de probabilidad.
Los empleos con una experiencia de entre 6 y 7 años, un identificador de título de trabajo ≤174, un identificador de habilidades ≤297, e identificador de categoría del rol ≤51 tendrán un salario en el rango [2865, 4213] con un 88.9% de probabilidad.
Los empleos con una experiencia mínima ≤7 años, una experiencia máxima >7 años, un identificador de título de trabajo >159, e identificador de localización >84 tendrán un salario en el rango [2865, 4213] con un 85.7% de probabilidad.
Los empleos con una experiencia máxima ≤6 años, un identificador de título de trabajo >312 y ≤349 tendrán un salario en el rango [2865, 4213] con un 77.8% de probabilidad.
Los empleos con una experiencia mínima de al menos un año, un identificador del área funcional ≤2, e identificador de industria >28 tendrán un salario en el rango [2865, 4213] con un 71.4% de probabilidad.
Los empleos con una experiencia máxima ≤6 años, un identificador de categoría del rol >10 y ≤51, un identificador del área funcional ≤31, e identificador de industria ≤28 tendrán un salario en el rango [2865, 4213] con un 64.7% de probabilidad.
Los empleos con una latitud de localización >28.57153, un identificador de título de trabajo ≤349, e identificador de categoría del rol ≤51 tendrán un salario en el rango [2865, 4213] con un 61.9% de probabilidad.
Los empleos con un identificador del área funcional ≤15 tendrán un salario en el rango [2865, 4213] con un 32.4% de probabilidad.
Los empleos con una experiencia máxima ≤3 años, un identificador de título de trabajo >349, un identificador de categoría del rol ≤51, un identificador del área funcional >14, e identificador de industria >28 tendrán un salario en el rango [4214, 5623] con un 87.5% de probabilidad.
Los empleos con una longitud de localización ≤76.13065, un identificador de habilidades >402, un identificador de categoría del rol >51, e identificador del área funcional >15 tendrán un salario en el rango [4214, 5623] con un 83.3% de probabilidad.
Los empleos con una latitud de localización ≤28.57153, una experiencia máxima >7 años y ≤9, e identificador de industria ≤10 tendrán un salario en el rango [4214, 5623] con un 80% de probabilidad.
Los empleos con una longitud de localización >77.33275, una experiencia mínima >7 años, un identificador de habilidades ≤391, e identificador de localización >54 tendrán un salario en el rango [4214, 5623] con un 80% de probabilidad.
Los empleos con una latitud de localización >28.46707 y ≤28.57153, una experiencia máxima ≤6 años, e identificador de rol >102 tendrán un salario en el rango [4214, 5623] con un 77.8% de probabilidad.
Los empleos con una longitud de localización >77.02225, una experiencia mínima >1 año, un identificador de título de trabajo >349, un identificador de categoría del rol ≤51, un identificador del área funcional >14, e identificador de industria >28 tendrán un salario en el rango [4214, 5623] con un 63% de probabilidad.
Los empleos con una experiencia máxima >6 años y ≤7, e identificador de localización >84 tendrán un salario en el rango [4214, 5623] con un 57.1% de probabilidad.
Los empleos con una longitud de localización ≤72.9249, una experiencia máxima ≤6 años, un identificador de título de trabajo ≤312, un identificador del área funcional >2, e identificador de industria >28 tendrán un salario >5623 con un 81.8% de probabilidad.
Los empleos con una latitud de localización >28.57153, un identificador de título de trabajo ≤349, un identificador de habilidades >394 y ≤459 tendrán un salario >5623 con un 80% de probabilidad.
Los empleos con un identificador de título de trabajo >139, un identificador de habilidades ≤402, un identificador de categoría del rol >51, e identificador del área funcional >18 tendrán un salario >5623 con un 72% de probabilidad.
Los empleos con una experiencia máxima ≤5 años, un identificador de habilidades ≤85, e identificador de categoría del rol >32 tendrán un salario >5623 con un 52.4% de probabilidad.
Los empleos con un identificador de industria >13 y ≤28 tendrán un salario >5623 con un 39.6% de probabilidad.
Los empleos leados con una experiencia máxima >7 años y ≤9 tendrán un salario >5623 con un 38.5% de probabilidad.
El atributo más relevante en este árbol es la latitud debido a que, como se apreció en el análisis de variables, existe una alta concentración de registros en la India.
A continuación, vamos a medir la calidad del modelo
[Explicar matriz de confusion - table() permite varias clases]
# Predice las clases en el conjunto de test
predictions <- predict(model, testX)
conf_matrix <- table(predictions, testY)
conf_matrix
## testY
## predictions 0-3251 3252-5164 >5164
## 0-3251 16 20 16
## 3252-5164 6 13 9
## >5164 27 27 24
A partir de esta matriz de confusión, podemos calcular las métricas definidad en ejercicios anteriores. Para ello, debemos plantear tres situaciones distintas, en las que, en cada una de ellas, los datos positivos son una clase distinta, y los negativos son el resto de clases. Por ejemplo, para el caso de considerar como positiva la clase “0-3251”, los TP, FP, TN y FN serán los siguientes:
A continuación, medimos la calidad del modelo para cada caso, así como la exactitud del modelo, medida como el porcentaje de datos bien clasificados (total de TP entre total de datos).
metrics <- data.frame("class"=as.factor(c("0-3251","3252-5164",">5164")))
metrics$TP <- rep(0, times=3)
metrics$FP <- rep(0, times=3)
metrics$FN <- rep(0, times=3)
metrics$TN <- rep(0, times=3)
metrics$sensibilidad <- rep(0, times=3)
metrics$precision <- rep(0, times=3)
metrics$especificidad <- rep(0, times=3)
metrics$f_measure <- rep(0, times=3)
for(i in 1:nrow(conf_matrix)){
TP <- conf_matrix[i, i]
FP <- sum(conf_matrix[i,]) - TP
FN <- sum(conf_matrix[,i]) - TP
TN <- sum(conf_matrix) - (TP+FP+FN)
metrics$TP[i] <- TP
metrics$FP[i] <- FP
metrics$FN[i] <- FN
metrics$TN[i] <- TN
metrics$sensibilidad[i] <- TP/(TP+FN)
metrics$precision[i] <- c(TP/(TP+FP))
metrics$especificidad[i] <- c(TN/(TN+FP))
metrics$f_measure[i] <- c(2*(metrics$precision[i]*metrics$sensibilidad[i])/(metrics$precision[i]+metrics$sensibilidad[i]))
}
print(metrics)
## class TP FP FN TN sensibilidad precision especificidad f_measure
## 1 0-3251 16 36 33 73 0.3265306 0.3076923 0.6697248 0.3168317
## 2 3252-5164 13 15 47 83 0.2166667 0.4642857 0.8469388 0.2954545
## 3 >5164 24 54 25 55 0.4897959 0.3076923 0.5045872 0.3779528
exactitud <- c(sum(metrics$TP)/sum(conf_matrix))
print(exactitud)
## [1] 0.335443
Vemos que el modelo, en términos generales, clasifica correctamente el 33,54% de los datos (exactitud), lo cual sigue siendo un resultado bastante pobre.
En cuanto a su eficiencia para detectar cada clase, vemos que el modelo tiende a clasificar los datos en el grupo “>5164”. Esto puede deberse a que esta clase es algo más representativa a las otras dos en el conjunto de datos de entrenamiento. Por ello, tanto el número de TP como el de FP es mayor en esta clase, y el número de FN y de TN es menor y, por tanto, tiene una mayor sensibilidad y una menor precisión.
Por su parte, para los grupos “0-3251” y “3252-5164”, el modelo es más pesimista, y tiende a clasificar los puntos como negativos, por lo que el número de TN y FN aumenta, mientras que el de TP y FP disminuye, haciendo que la sensibilidad y especificidad del modelo en esos casos disminuya y aumente, respectivamente, en comparación al grupo “>5164”.
Además, el modelo tiene una mayor precisión en el caso del grupo “3252-5164”, ya que este es el más representativo en el conjunto de datos de validación.
En cuanto al valor de f-measure, vemos que el grupo “>5164” tiene un mejor equilibrio entre positivos y negativos, debido a que tiene una mayor sensibilidad y una precisión moderada respecto a los otros.
En general, los valores son bastante bajos en los tres casos, indicando que el modelo tiene dificultades para clasificar correctamente tanto los casos positivos como los negativos y requiere de ajustes adicionales o de un mejor preprocesado de los datos para mejorar su rendimiento.
La poda y el boosting son dos técnicas populares para mejorar el rendimiento de los árboles de decisión.
La poda se refiere al proceso de eliminar ramas no importantes del árbol para evitar el sobreajuste. El objetivo de la poda es mejorar la precisión generalizada del árbol al reducir su complejidad.
Por otro lado, el boosting es un enfoque de ensamblado que combina varios árboles de decisión débiles para crear un árbol de decisión más fuerte. El objetivo del boosting es mejorar la precisión del árbol mediante la combinación de varios modelos débiles. El resultado final es un modelo que combina varios árboles de decisión débiles para crear uno más preciso.
Sin embargo, es importante tener en cuenta que tanto la poda como el boosting tienen sus limitaciones. La poda puede conducir a una pérdida de información y un rendimiento menor si se podan demasiadas ramas importantes. Por otro lado, el boosting puede ser sensible a los datos ruidosos y puede requerir un gran número de árboles para obtener un rendimiento adecuado.
Para solucionar estas limitaciones, es importante realizar una evaluación cuidadosa del modelo y ajustar los parámetros según sea necesario. Por ejemplo, se pueden probar diferentes límites de complejidad en la poda para encontrar el mejor equilibrio entre precisión y complejidad. Además, se pueden utilizar técnicas como la validación cruzada para evaluar el rendimiento del modelo y detectar posibles problemas de sobreajuste.
pruned_model <- C50::C5.0(trainX, trainY,rules=TRUE, trials=5)
summary(pruned_model)
##
## Call:
## C5.0.default(x = trainX, y = trainY, trials = 5, rules = TRUE)
##
##
## C5.0 [Release 2.07 GPL Edition] Wed Jan 25 18:18:22 2023
## -------------------------------
##
## Class specified by attribute `outcome'
##
## Read 315 cases (12 attributes) from undefined.data
##
## ----- Trial 0: -----
##
## Rules:
##
## Rule 0/1: (6, lift 2.6)
## Longitude <= 77.63704
## Latitude > 13.02333
## minExp > 8
## minExp <= 11
## -> class 0-3251 [0.875]
##
## Rule 0/2: (6, lift 2.6)
## Longitude > 73.85683
## numeric.Location > 26
## numeric.Functional.Area > 36
## -> class 0-3251 [0.875]
##
## Rule 0/3: (5, lift 2.5)
## Longitude <= 73.85683
## numeric.Key.Skills > 439
## -> class 0-3251 [0.857]
##
## Rule 0/4: (8/1, lift 2.4)
## numeric.Job.Title > 281
## numeric.Job.Title <= 415
## numeric.Role.Category <= 10
## numeric.Functional.Area <= 36
## -> class 0-3251 [0.800]
##
## Rule 0/5: (7/1, lift 2.3)
## maxExp <= 2
## numeric.Location <= 74
## numeric.Role <= 103
## -> class 0-3251 [0.778]
##
## Rule 0/6: (10/3, lift 2.0)
## Longitude > 73.85683
## numeric.Functional.Area > 36
## -> class 0-3251 [0.667]
##
## Rule 0/7: (19/8, lift 1.7)
## Latitude > 17.36059
## maxExp <= 2
## -> class 0-3251 [0.571]
##
## Rule 0/8: (39/20, lift 1.4)
## numeric.Role > 113
## -> class 0-3251 [0.488]
##
## Rule 0/9: (10, lift 3.1)
## Longitude <= 73.85683
## numeric.Job.Title > 281
## numeric.Job.Title <= 415
## numeric.Key.Skills > 259
## numeric.Role.Category > 10
## -> class 3252-5164 [0.917]
##
## Rule 0/10: (6, lift 3.0)
## Latitude <= 13.02333
## maxExp > 2
## numeric.Functional.Area <= 14
## numeric.Role <= 113
## -> class 3252-5164 [0.875]
##
## Rule 0/11: (3, lift 2.7)
## Longitude > 73.85683
## Longitude <= 76.77972
## maxExp <= 5
## numeric.Industry <= 22
## -> class 3252-5164 [0.800]
##
## Rule 0/12: (3, lift 2.7)
## Longitude <= 76.77972
## Latitude > 23.02162
## maxExp <= 7
## -> class 3252-5164 [0.800]
##
## Rule 0/13: (6/1, lift 2.6)
## Longitude <= 73.85683
## minExp > 5
## minExp <= 7
## numeric.Job.Title <= 281
## -> class 3252-5164 [0.750]
##
## Rule 0/14: (23/10, lift 1.9)
## Longitude <= 73.85683
## numeric.Key.Skills > 176
## numeric.Key.Skills <= 279
## -> class 3252-5164 [0.560]
##
## Rule 0/15: (244/158, lift 1.2)
## minExp <= 8
## maxExp > 2
## numeric.Functional.Area <= 36
## numeric.Role <= 128
## -> class 3252-5164 [0.354]
##
## Rule 0/16: (8, lift 2.4)
## minExp <= 0
## maxExp > 1
## maxExp <= 2
## numeric.Location > 74
## -> class >5164 [0.900]
##
## Rule 0/17: (32/13, lift 1.6)
## Longitude > 73.85683
## numeric.Job.Title > 160
## numeric.Job.Title <= 226
## -> class >5164 [0.588]
##
## Rule 0/18: (258/158, lift 1.1)
## Latitude > 13.02333
## -> class >5164 [0.388]
##
## Default class: >5164
##
## ----- Trial 1: -----
##
## Rules:
##
## Rule 1/1: (12.5/3.2, lift 2.0)
## numeric.Industry > 27
## numeric.Role > 128
## -> class 0-3251 [0.709]
##
## Rule 1/2: (8.6/3.2, lift 1.7)
## maxExp <= 1
## -> class 0-3251 [0.604]
##
## Rule 1/3: (265.7/174.8, lift 1.2)
## maxExp > 2
## numeric.Functional.Area <= 36
## numeric.Role <= 128
## -> class 3252-5164 [0.343]
##
## Rule 1/4: (2.7, lift 2.3)
## Longitude <= 73.85683
## numeric.Functional.Area > 36
## -> class >5164 [0.788]
##
## Rule 1/5: (14.1/4.8, lift 1.8)
## maxExp > 1
## maxExp <= 2
## numeric.Industry <= 38
## -> class >5164 [0.641]
##
## Default class: 0-3251
##
## *** boosting reduced to 1 trial since last classifier is very inaccurate
##
## *** boosting abandoned (too few classifiers)
##
##
## Evaluation on training data (315 cases):
##
## Rules
## ----------------
## No Errors
##
## 18 120(38.1%) <<
##
##
## (a) (b) (c) <-classified as
## ---- ---- ----
## 47 14 46 (a): class 0-3251
## 4 52 36 (b): class 3252-5164
## 12 8 96 (c): class >5164
##
##
## Attribute usage:
##
## 86.98% numeric.Role
## 85.40% maxExp
## 83.81% Latitude
## 81.90% minExp
## 81.90% numeric.Functional.Area
## 27.30% Longitude
## 17.78% numeric.Job.Title
## 11.43% numeric.Key.Skills
## 6.67% numeric.Location
## 5.71% numeric.Role.Category
## 0.95% numeric.Industry
##
##
## Time: 0.0 secs
# Predice las clases en el conjunto de test
predictions <- predict(pruned_model, testX)
conf_matrix <- table(predictions, testY)
conf_matrix
## testY
## predictions 0-3251 3252-5164 >5164
## 0-3251 10 24 10
## 3252-5164 10 14 11
## >5164 29 22 28
metrics <- data.frame("class"=as.factor(c("0-3251","3252-5164",">5164")))
metrics$TP <- rep(0, times=3)
metrics$FP <- rep(0, times=3)
metrics$FN <- rep(0, times=3)
metrics$TN <- rep(0, times=3)
metrics$sensibilidad <- rep(0, times=3)
metrics$precision <- rep(0, times=3)
metrics$especificidad <- rep(0, times=3)
metrics$f_measure <- rep(0, times=3)
for(i in 1:nrow(conf_matrix)){
TP <- conf_matrix[i, i]
FP <- sum(conf_matrix[i,]) - TP
FN <- sum(conf_matrix[,i]) - TP
TN <- sum(conf_matrix) - (TP+FP+FN)
metrics$TP[i] <- TP
metrics$FP[i] <- FP
metrics$FN[i] <- FN
metrics$TN[i] <- TN
metrics$sensibilidad[i] <- TP/(TP+FN)
metrics$precision[i] <- c(TP/(TP+FP))
metrics$especificidad[i] <- c(TN/(TN+FP))
metrics$f_measure[i] <- c(2*(metrics$precision[i]*metrics$sensibilidad[i])/(metrics$precision[i]+metrics$sensibilidad[i]))
}
print(metrics)
## class TP FP FN TN sensibilidad precision especificidad f_measure
## 1 0-3251 10 34 39 75 0.2040816 0.2272727 0.6880734 0.2150538
## 2 3252-5164 14 21 46 77 0.2333333 0.4000000 0.7857143 0.2947368
## 3 >5164 28 51 21 58 0.5714286 0.3544304 0.5321101 0.4375000
exactitud <- c(sum(metrics$TP)/sum(conf_matrix))
print(exactitud)
## [1] 0.3291139
Como era de esperar, el resultado de las predicciones es algo peor, aunque el modelo es bastante menos complejo.
En comparación con el modelo de árbol sin poda, el modelo con poda tiene una mayor sensibilidad para el grupo “>5164”, lo que significa que tiene una mayor capacidad para detectar casos verdaderos. Sin embargo, también tiene una menor precisión para este grupo, lo que significa que tiene una mayor probabilidad de clasificar a casos falsos como verdaderos.
Por otro lado, el modelo con poda tiene una menor sensibilidad y precisión para los grupos “0-3251” y “3252-5164”, lo que significa que tiene una menor capacidad para detectar casos verdaderos y una mayor probabilidad de clasificar a casos falsos como verdaderos para estos grupos. Sin embargo, el modelo con poda tiene una mayor especificidad para estos grupos, lo que significa que tiene una menor probabilidad de clasificar a casos falsos como verdaderos.
En general, el modelo de árbol con poda tiene una exactitud ligeramente menor que el modelo sin poda (0.329 vs 0.335), pero es menos complejo y puede ser más fácil de interpretar y explicar.
En general, un modelo de árbol sin poda se beneficia de tener una mayor complejidad, pero también tiene un mayor riesgo de sobreajuste, mientras que un modelo de árbol con poda tiene un menor riesgo de sobreajuste, pero también tiene un menor rendimiento debido a la poda.
Estas han sido calculadas para el árbol sin poda y árbol con poda en los puntos 4.3 y 4.4, respectivamente.
Uno de los principales beneficios de los árboles de decisión es su capacidad para manejar problemas con muchas variables y clases. Su habilidad para lidiar con una gran cantidad de variables y clases es una de las principales ventajas de los árboles de decisión. Además, son fáciles de interpretar y visualizar, ya que la estructura del árbol es fácil de entender y representa las decisiones y las características importantes en el problema. Los árboles de decisión también son robustos y pueden manejar tanto variables categóricas como numéricas.
Sin embargo, uno de los principales inconvenientes de los árboles de decisión es su tendencia a sobreajustarse al conjunto de entrenamiento, lo que puede llevar a un mal rendimiento en el conjunto de pruebas. Esta tendencia a sobreajustarse a los datos de entrenamiento es una de las principales desventajas de los árboles de decisión. Por esta razón, es común usar técnicas de poda para controlar el tamaño del árbol y mejorar su generalización. La técnica de poda se utiliza para reducir el tamaño del árbol y mejorar la capacidad de generalización del modelo.
Además, al igual que en los modelos anteriores, no se aprecia una clara correlación entre la variable dependiente y las variables independientes y, por ello, no se logra una división eficiente entre las ramas. La falta de una clara correlación entre la variable dependiente y las variables independientes puede dificultar la eficacia de la división entre ramas en los árboles de decisión. Por esto es importante realizar una buena selección y transformación de características.
En esta ocasión, vamos a utilizar un modelo de regresión lineal para tratar de predecir el salario correspondiente a un empleo.
La regresión lineal es un método estadístico que se utiliza para modelar la relación entre una variable dependiente y una o más variables independientes. El objetivo es encontrar los coeficientes del modelo que minimizan la diferencia entre los valores observados y los valores predichos por el modelo.
El modelo de regresión lineal se representa matemáticamente como:
\(y = \beta_0 + \beta_1*x_1 + \beta_2*x_2 + ...+ \beta_n*x_n\)
donde y es la variable dependiente, \(x_1\), \(x_2\), …, \(x_n\) son las variables independientes y \(\beta_0\), \(\beta_1\), \(\beta_2\), …, \(\beta_n\) son los coeficientes del modelo.
Los coeficientes del modelo son los valores que se ajustan para minimizar la diferencia entre los valores observados y los valores predichos. \(\beta_0\) es el término independiente o intercepto, y \(\beta_1\), \(\beta_2\), …, \(\beta_n\) son los términos de las variables independientes.
La regresión lineal es útil para modelar relaciones lineales entre variables, es decir, relaciones donde el cambio en la variable dependiente es proporcional al cambio en las variables independientes. Sin embargo, no siempre es adecuado para modelar relaciones no lineales o relaciones más complejas.
A continuación, para crear el modelo, vamos a dividir el conjunto de datos original en datos de entrenamiento y test de igual modo que en apartados anteriores y vamos a utilizar la función lm() para crear el modelo de regresión lineal.Esta función acepta como argumentos una fórmula y un conjunto de datos, y devuelve un objeto de modelo de regresión lineal. La fórmula especifica la relación entre las variables en los datos. Es una cadena de texto que especifica la relación entre la variable dependiente (o variable objetivo) y las variables independientes (o variables predictoras). La fórmula se escribe utilizando el operador ’~’ para separar la variable dependiente de las variables independientes. El conjunto de datos es un data frame que contiene los datos utilizados para entrenar el modelo. Debe incluir las columnas especificadas en la fórmula. (fuente: https://www.institutomora.edu.mx/testU/SitePages/martinpaladino/modelos_lineales_con_R.html).
# Recuperamos los datos preprocesados
data <- dataAux
# Eliminamos valores nulos que hayan podido quedar tras el preprocesado
data <- na.omit(data)
# Definimos semilla de aleatoriedad
set.seed(1)
# Separamos la etiqueta del resto de datos
y <- data$sal
X <- data %>% select(-sal)
# Separamos los datos de entrenamiento y test de forma aleatoria
split_prop <- 3
indexes = sample(1:nrow(data), size=floor(((split_prop-1)/split_prop)*nrow(data)))
trainX<-X[indexes,]
trainY<-y[indexes]
testX<-X[-indexes,]
testY<-y[-indexes]
trainY_df <- data.frame(y=trainY)
model <- lm(y ~ ., data=cbind(trainX,trainY_df))
summary(model)
##
## Call:
## lm(formula = y ~ ., data = cbind(trainX, trainY_df))
##
## Residuals:
## Min 1Q Median 3Q Max
## -3062.65 -1286.69 -40.89 1387.90 3057.26
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8352.2252 3395.4630 2.460 0.0145 *
## Longitude -50.9610 43.7381 -1.165 0.2449
## Latitude 5.6305 16.6700 0.338 0.7358
## minExp 11.7443 74.1677 0.158 0.8743
## maxExp -45.1487 59.0902 -0.764 0.4454
## numeric.Job.Title -0.9398 0.6827 -1.377 0.1697
## numeric.Key.Skills 0.2187 0.6512 0.336 0.7373
## numeric.Role.Category 13.7571 5.3280 2.582 0.0103 *
## numeric.Location -2.7036 3.0396 -0.889 0.3745
## numeric.Functional.Area 4.7499 9.1128 0.521 0.6026
## numeric.Industry -1.5536 7.5028 -0.207 0.8361
## numeric.Role -3.8064 2.2204 -1.714 0.0875 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1558 on 303 degrees of freedom
## Multiple R-squared: 0.05889, Adjusted R-squared: 0.02472
## F-statistic: 1.724 on 11 and 303 DF, p-value: 0.06747
El resumen del modelo proporciona información sobre los coeficientes del modelo, los residuos, el rendimiento del modelo y otras estadísticas.
Los residuos son la diferencia entre los valores observados y los valores predichos por el modelo. El resumen de los residuos muestra la distribución de los residuos, con estadísticas como la media, la mediana, el cuartil 1 y 3, y el valor mínimo y máximo.
Los coeficientes muestran la relación entre cada variable independiente y la variable dependiente. Por ejemplo, el coeficiente de la variable Longitud es -50.9610, lo que significa que por cada unidad de cambio en Longitud, se espera un cambio de -50.9610 en la variable dependiente (y). El error estándar del coeficiente es 43.7381, lo que indica la incertidumbre en la estimación del coeficiente. El valor t y el valor p proporcionan información sobre la significancia estadística del coeficiente. Un valor p pequeño (<0.05) sugiere que el coeficiente es estadísticamente significativo.
El R-cuadrado es una medida de qué porcentaje de la variación en los datos de salida (variable dependiente) es explicado por el modelo. El R-cuadrado es 0.05889, lo que significa que solo el 5.89% de la variación en los datos de salida es explicado por el modelo. El R-cuadrado ajustado tiene en cuenta el número de variables independientes y es 0.02472, lo que significa que solo el 2.47% de la variación en los datos de salida es explicada por el modelo.
El estadístico F y su valor p proporcionan información sobre la significancia del modelo en general. El valor p es 0.06747, lo que significa que hay un 6.75% de posibilidades de obtener un modelo tan malo o peor debido al azar. Como el valor p es mayor que 0.05, no podemos rechazar la hipótesis nula de que el modelo no es significativo. Es importante notar que un valor p mayor a 0.05 no significa necesariamente que el modelo no sea bueno, pero puede sugerir que no hay suficiente evidencia para apoyar la idea de que el modelo es significativo.
En general, se puede observar que el rendimiento del modelo no es muy bueno ya que el R-cuadrado es muy bajo. También se puede observar que algunos coeficientes tienen valores p mayores a 0.05, lo que sugiere que no son estadísticamente significativos. Esto puede indicar que algunas de las variables independientes no tienen una relación significativa con la variable dependiente o que se necesitan más datos para apoyar la relación.
A continuación, vamos a ver cómo se comporta el modelo con el conjunto de datos de teste. Para ello, vamos a predecir los valores de los datos de testeo con el modelo y vamos a calcular el valor de las métricas Error absoluto medio (Mean Absolute Error, MAE) y Error cuadrático medio (Mean Squared Error, MSE). MAE mide la diferencia entre los valores predichos y los valores reales pero tomando en cuenta solo el valor absoluto de la diferencia. Un valor más pequeño de MAE indica un mejor ajuste del modelo a los datos. MSE mide la diferencia entre los valores predichos y los valores reales, al cuadrado. Un valor más pequeño de MSE indica un mejor ajuste del modelo a los datos.
La principal diferencia entre el MAE y el MSE es que el MAE se enfoca en los errores absolutos mientras que el MSE se enfoca en los errores cuadráticos. El MSE es más sensible a los errores grandes, ya que los multiplica por si mismos, mientras que el MAE solo se enfoca en la magnitud del error. Esto significa que un solo error grande puede aumentar significativamente el MSE, mientras que el MAE solo se verá afectado moderadamente. Por lo tanto, el MSE es más útil para detectar patrones de error en los casos en los que los errores grandes son particularmente problemáticos, mientras que el MAE es más útil para detectar patrones de error en general.
predictions <- predict(model, testX)
mae <- mean(abs(as.numeric(testY) - as.numeric(predictions)))
mae
## [1] 1511.425
mse <- mean((as.numeric(testY) - as.numeric(predictions))^2)
mse
## [1] 3046861
mae^2
## [1] 2284405
En cuanto al MAE obtenido, vemos que el modelo tiene un desvío promedio de 1511.425, un valor extremadamente alto teniendo en cuenta la magnitud de los valores a predecir.
En cuanto al MSE, vemos que tiene un valor de 3.046861*10^6, que es aún mayor que el MAE^2, lo que sugiere que el modelo tiene una serie de errores grandes que hacen que aumente mucho este valor.
Estos valores reflejan que el modelo no está realizando una buena predicción, y que es necesario hacer ajustes en el modelo o utilizar un enfoque diferente para mejorar su precisión.
Dado que con una regresión lineal no se consigue crear un buen modelo para este dataset, vamos a probar utilizando una regresión no lineal, en este caso, con una polinómica.
Los modelos de regresión no lineales son aquellos que no se ajustan a una función lineal entre las variables independientes y la variable dependiente. En lugar de eso, estos modelos utilizan funciones matemáticas más complejas para describir la relación entre las variables.
La regresión polinómica es una técnica de regresión no lineal que se utiliza para modelar relaciones no lineales entre las variables. En lugar de utilizar una función lineal como en la regresión lineal, se utiliza un polinomio de grado mayor. El grado del polinomio se refiere al número de términos en el polinomio (\(P(x) = c_0 + x*c_1 + x^2*c_2 + ... + x^n*c_n = \sum_{i=0}^{n}x^i*c_i\)). El polinomio se ajusta al conjunto de datos mediante el ajuste de los coeficientes de los términos del polinomio a los datos.
Al utilizar un polinomio de grado mayor, se permite al modelo adaptarse mejor a los datos y capturar patrones no lineales en los datos. Sin embargo, también hay un riesgo de sobreajuste, es decir, que el modelo se ajuste demasiado bien a los datos de entrenamiento pero no generalice bien a datos nuevos. Por lo tanto, es importante evaluar cuidadosamente el rendimiento del modelo en datos de prueba antes de utilizarlo en una aplicación real.
Para ello, vamos a utilizar la función glm() (Generalized Linear Model) que crea modelos de regresión generalizados. La regresión generalizada es una extensión de la regresión lineal que permite modelar una amplia variedad de relaciones entre variables y distribuciones de error. La función glm() es capaz de manejar distintos tipos de distribuciones de error y link functions, lo que permite modelar una variedad de problemas de regresión, como la regresión polinómica. La sintaxis básica de la función glm() es la siguiente:
glm(formula, family, data)
Donde:
formula es una fórmula que describe la relación entre las variables de interés. Por ejemplo, \(y ~ x + x^2\) describe una relación lineal entre la variable dependiente y y las variables independiente x.
family es el parámetro opcional que se utiliza para especificar la distribución de error y el enlace. Por defecto, se utiliza una distribución gaussiana y un enlace identity.
data es el conjunto de datos que se utilizará para el ajuste del modelo.
Para evitar un modelo demasiado complejo, vamos a generar una regresión polinómica en función de una única variable independiente, por lo tanto, debemos calcular qué variable independiente y grado del polinomio se ajustan mejor al modelo. Además, para tratar de evitar el sobreajuste de los distintos modelos generados, vamos a utilizar la validación cruzada - cross validation - una técnica utilizada para evaluar la precisión y robustez de un modelo de aprendizaje automático, consistente en dividir el conjunto de datos en varios subconjuntos, conocidos como “fold” y entrenar el modelo en varios subconjuntos diferentes mientras se evalúa en el subconjunto restante. Esto se repite varias veces, utilizando diferentes combinaciones de subconjuntos para entrenamiento y evaluación, de manera que cada punto de datos se utiliza una sola vez para evaluar el modelo. La ventaja de la validación cruzada es que permite obtener una medida más precisa de la precisión del modelo, ya que se utilizan varios subconjuntos de datos para evaluar el modelo, en lugar de utilizar solo un subconjunto de datos. También permite identificar si el modelo tiene problemas de sobreajuste o subajuste, ya que se evalúa en diferentes subconjuntos de datos.
La función cv.glm() es una función en R que se
utiliza para realizar validación cruzada en modelos de regresión
generalizada creados con la función glm().
Esta función permite evaluar la precisión y robustez del modelo mediante
la división del conjunto de datos en varios subconjuntos y entrenando y
evaluando el modelo en diferentes combinaciones de subconjuntos.
La sintaxis básica de la función cv.glm() es la siguiente:
cv.glm(data, glmfit, cost, K)
Donde:
data es el conjunto de datos utilizado para el ajuste del modelo.
glmfit es el objeto devuelto por la función glm() que contiene el modelo de regresión generalizada a evaluar.
cost es una función de dos argumentos vectoriales que especifican la función de costo para la validación cruzada. El primer argumento del costo debe corresponder a las respuestas observadas y el segundo argumento debe corresponder a las respuestas pronosticadas o ajustadas del modelo lineal generalizado. cost debe devolver un valor escalar no negativo. El valor predeterminado es la función de error cuadrático promedio.
K es el número de subconjuntos o “fold” utilizados para la validación cruzada. Generalmente, se suelen utilizanr 10 subconjuntos.
La función cv.glm() devuelve un objeto que contiene información sobre el rendimiento del modelo en la validación cruzada, como la precisión promedio y la desviación estándar. También se pueden obtener información sobre la precisión del modelo en cada una de las iteraciones de validación cruzada.
Fuentes: https://rpubs.com/Cristina_Gil/Regr_no_lineal ; https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/glm ; https://www.rdocumentation.org/packages/boot/versions/1.3-28.1/topics/cv.glm
if(!require('boot')) install.packages('boot'); library(boot)
## Loading required package: boot
##
## Attaching package: 'boot'
## The following object is masked from 'package:psych':
##
## logit
## The following object is masked from 'package:lattice':
##
## melanoma
if(!require('gridExtra')) install.packages('gridExtra'); library(gridExtra)
## Loading required package: gridExtra
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
# Datos de entrenamiento
data <- cbind(trainY_df, trainX)
# Dataframe para almacenar el mejor error de validación de cada variable
mejor.cv.error <- data.frame("variable.independiente"=factor(), "cv.error"=numeric())
# Regresión polinómica con cada variable independiente
for(col in colnames(trainX)){
# Dataframe con la variable dependiente y la independiente a analizar
aux_df <- select(data, y, col)
colnames(aux_df) <- c("y", "x")
# Variable para almacenar el error de validacion minimo de la variable
min.error <- Inf
# Vector para almacenar el error de validación de cada polinomio
cv.error <- rep(NA, 10)
# Vector para almacenar el RSS de cada polinomio
rss <- rep (NA, 10)
# Polinomio de grado 1 a 10
for (i in 1:10){
# Creo el modelo polinómico de grado i
polynomic_model <- glm(y ~ poly(x, i), data = aux_df)
# Calculo error de validación y RSS
cv.error[i] <- cv.glm(aux_df, polynomic_model, K = 10)$delta[1]
rss[i] <- sum(polynomic_model$residuals^2)
# Actualizo el mejor error de validación
if(cv.error[i] < min.error){
min.error <- cv.error[i]
}
}
# Guardo el mejor error
mejor.cv.error <- rbind(mejor.cv.error, data.frame("variable.independiente" = col, "cv.error" = min.error))
# Mostrar evolucion del error en función del grado del polinomio
ggp_mse <- ggplot(data = data.frame(grado_polinomio = 1:10, cv.error = cv.error), aes(x = grado_polinomio, y = cv.error)) +
geom_point(color = "orangered2") +
geom_path() +
scale_x_continuous(breaks = 0:10) +
labs(title = "cv.MSE ~ Grado de polinomio") +
theme_bw() +
theme(panel.background = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
theme(plot.title = element_text(hjust = 0.5))
# Mostrar evolucion RSS en función del grado del polinomio
ggp_rss <- ggplot(data = data.frame(grado_polinomio = 1:10, RSS = rss), aes(x = grado_polinomio,y = RSS)) +
geom_point(color = "orangered2") +
geom_path() +
scale_x_continuous(breaks=0:10) +
labs(title = "RSS ~ Grado de polinomio") +
theme_bw() +
theme(panel.background = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
theme(plot.title = element_text(hjust = 0.5))
# Muestro las dos gráficas en una
grid_title <- textGrob(toupper(col), gp = gpar(fontsize = 14, fontface = "bold", col="red"))
grid.arrange(ggp_mse, ggp_rss, ncol = 1, top = grid_title)
}
## Warning: Using an external vector in selections was deprecated in tidyselect 1.1.0.
## ℹ Please use `all_of()` or `any_of()` instead.
## # Was:
## data %>% select(col)
##
## # Now:
## data %>% select(all_of(col))
##
## See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
# Mostrar evolucion del error en función del grado de la variable independiente
ggplot(data = mejor.cv.error, aes(x = variable.independiente, y = cv.error, group = 1)) +
geom_point(color = "orangered2") +
geom_line() +
labs(title = "cv.MSE ~ Variable independiente") +
theme_bw() +
theme(panel.background = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.text.x = element_text(angle = 45)) +
theme(plot.title = element_text(hjust = 0.5))
Vemos que la variable que permite generar el mejor modelo es ‘numeric.Role.Category’. Vemos además, que este resultado se obtiene con una regresión polinómica de grado 2. Por lo tanto, utilizamos este modelo para predecir las etiquetas del conjunto de test.
polynomic_model <- lm(y ~ poly(numeric.Role.Category, 2), data = data)
summary(polynomic_model)
##
## Call:
## lm(formula = y ~ poly(numeric.Role.Category, 2), data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3052.58 -1320.30 1.73 1330.54 2949.83
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4225.15 87.83 48.107 <2e-16 ***
## poly(numeric.Role.Category, 2)1 3778.09 1558.81 2.424 0.0159 *
## poly(numeric.Role.Category, 2)2 2998.83 1558.81 1.924 0.0553 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1559 on 312 degrees of freedom
## Multiple R-squared: 0.02978, Adjusted R-squared: 0.02356
## F-statistic: 4.788 on 2 and 312 DF, p-value: 0.008954
ggplot(data = data, aes(x = numeric.Role.Category, y = y)) +
geom_point(col = "darkgrey") +
geom_smooth(method = "lm", formula = y ~ poly(x, 2), color = "blue", se = TRUE, level = 0.95) +
labs(title = "Polinomio grado 3: y ~ numeric.Role.Category") +
theme_bw() + theme(plot.title = element_text(hjust = 0.5))
predictions <- predict(polynomic_model, testX)
mae <- mean(abs(as.numeric(testY) - as.numeric(predictions)))
mae
## [1] 1491.881
mse <- mean((as.numeric(testY) - as.numeric(predictions))^2)
mse
## [1] 2877937
mae^2
## [1] 2225709
Aunque el error obtenido con el modelo de regresión no lineal es menor que el obtenido con el modelo anterior de regresión lineal, este sigue teniendo un valor demasiado elevado teniendo en cuenta la magnitud de los valores a predecir. Los valores de MAE y MSE refleja la dificultad del modelo para aprender de este conjunto de datos, los cuales, no están distribuidos en el espacio de atributos de forma que al modelo le sea posible generalizar a partir de estos datos.
El modelo de regresión, a diferencia del modelo de clasificación, permite analizar la distancia entre un valor predicho y su valor real.
A pesar de eso, ambos tipos de modelos no logran generar un buen modelo que se ajuste a los datos y sea capaz de realizar predicciones correctas debido a que los datos no están distribuidos en el espacio de atributos, de forma que los modelo les es posible generalizar a partir de estos datos.
En cuanto a los resultados, se puede observar que el modelo de clasificación tiene una sensibilidad baja en todas las categorías, lo que significa que tiene dificultades para detectar correctamente los casos positivos. Además, la precisión también es baja, lo que indica que tiene un alto número de falsos positivos. Por otro lado, la especificidad es alta, lo que significa que tiene pocos falsos negativos. El f-measure también es bajo, lo que indica una mala performance general del modelo.
En cuanto a los modelos de regresión, se puede observar que el modelo lineal tiene un error medio absoluto (mae) de 1511.425, mientras que el modelo polinómico tiene un mae de 1491.881. Esto significa que el modelo polinómico tiene un mejor desempeño en términos de precisión en las predicciones. Sin embargo, ambos modelos tienen un error medio cuadrático (mse) alto, lo que indica que aún tienen dificultades para ajustarse adecuadamente a los datos.
En resumen, los modelos de clasificación y regresión presentados en este ejemplo no logran generar un buen modelo debido a la distribución de los datos, y aún presentan un desempeño bajo en términos de precisión y ajuste a los datos. Es posible que sea necesario utilizar técnicas adicionales de preprocesamiento y selección de características para mejorar la performance de los modelos.
Los datos seleccionados para este ejemplo tienen varias limitaciones que pueden afectar la capacidad de los modelos para generar conclusiones precisas y generales:
Falta de información: los datos utilizados en este ejemplo pueden no contener toda la información relevante para los modelos utilizados, lo que puede dar lugar a conclusiones inexactas.
Falta de calidad: los datos utilizados en este ejemplo pueden estar incompletos, incorrectos o inconsistentes, lo que puede dar lugar a conclusiones inexactas.
Falta de normalización: los datos utilizados en este ejemplo pueden no estar normalizados, lo que puede dar lugar a un sesgo en los modelos utilizados.
Falta de distribución: Los datos utilizados en este ejemplo pueden no estar distribuidos de forma que los modelos puedan generalizar correctamente.
Es importante tener en cuenta estas limitaciones al interpretar los resultados de los modelos utilizados y al tomar decisiones basadas en ellos
El uso de modelos en cualquier campo conlleva ciertos riesgos que deben ser considerados antes de implementar el modelo en un entorno real. A continuación se describen algunos de los riesgos más comunes que pueden presentarse al utilizar un modelo:
Riesgo de sesgo: Uno de los riesgos más importantes al utilizar un modelo es el riesgo de sesgo. Un modelo puede estar sesgado si los datos utilizados para entrenarlo no son representativos de la población general. Esto puede ocurrir debido a la falta de diversidad en los datos de entrenamiento o debido a la falta de normalización. Por ejemplo, si los datos de entrenamiento están compuestos principalmente por hombres, el modelo puede tener dificultades para clasificar correctamente a las mujeres. Además, si los datos de entrenamiento no están normalizados, el modelo puede tener dificultades para generalizar a otros conjuntos de datos. Para mitigar este riesgo, es importante asegurar que los datos de entrenamiento sean representativos de la población general y que estén normalizados.
Riesgo de sobreajuste: El sobreajuste es otro riesgo común al utilizar un modelo. Un modelo puede estar sobreajustado si se utilizan demasiadas características o se utilizan características irrelevantes para el problema en cuestión. Esto puede ocurrir debido a la falta de selección de características adecuada. Por ejemplo, si se utilizan demasiadas características irrelevantes, el modelo puede tener una buena performance en los datos de entrenamiento, pero una mala performance en los datos de prueba o en el entorno real. Para mitigar este riesgo, es importante utilizar técnicas de selección de características para seleccionar solo las características relevantes.
Riesgo de datos no válidos: Un modelo puede ser afectado por datos no válidos, como datos incompletos, incorrectos o inconsistentes. Esto puede llevar a conclusiones inexactas o a una mala performance del modelo.
Riesgo de interpretación incorrecta: Otro riesgo común al utilizar un modelo es el riesgo de interpretación incorrecta. Un modelo puede ser interpretado de forma incorrecta debido a la falta de conocimiento o experiencia del usuario. Por ejemplo, un modelo puede generar resultados que sugieren una relación causual entre dos variables, pero en realidad, esta relación puede ser correlacional. Para mitigar este riesgo, es importante asegurar que los usuarios del modelo tengan el conocimiento y la experiencia necesarios para interpretar correctamente los resultados.
Riesgo de automatización: El riesgo de automatización es otro riesgo común al utilizar un modelo. Un modelo puede automatizar decisiones que deben ser tomadas por seres humanos, lo que puede llevar a decisiones que no tienen en cuenta factores importantes como el contexto o la ética. Por ejemplo, un modelo puede ser utilizado para automatizar decisiones de credito, pero si no se tienen en cuenta factores como la situación financiera o el historial laboral del solicitante, puede llevar a decisiones desfavorables para algunas personas. Para mitigar este riesgo, es importante asegurar que los usuarios del modelo tengan el conocimiento y la experiencia necesarios para tomar decisiones éticas y considerando todos los factores importantes.
En resumen, al utilizar un modelo es importante considerar estos riesgos y tomar medidas para mitigarlos. Esto puede incluir la revisión de los datos utilizados para entrenar el modelo, la interpretación cuidadosa de los resultados y la transparencia en la utilización del modelo. Además, es importante recordar que los modelos son solo herramientas y no deben ser considerados como sustitutos de la toma de decisiones humanas.
En esta práctica, he aprendido la importancia de encontrar un conjunto de datos válido para poder obtener resultados precisos y fiables. A través de esta experiencia, me di cuenta de que la calidad de los datos es crucial para el éxito del modelo y que un conjunto de datos incompleto o inconsistente puede generar resultados erróneos.
Una vez que encontré un conjunto de datos válido, aprendí la importancia de preparar los datos correctamente para poder utilizarlos en el modelo. Esto incluyó tareas como la limpieza de datos, la normalización, la codificación de variables categóricas, entre otras. Aprendí que estas tareas son esenciales para asegurar que los datos estén listos para ser utilizados en el modelo y que su falta puede generar resultados erróneos.
Además, encontré dificultades para detectar las variables más relevantes para el problema, lo cual me permitiera tener una mejor comprensión del conjunto de datos y como podría ser utilizado para resolver el problema. Descubrí que no todas las variables son necesarias para el modelo y que su inclusión puede generar un sobreajuste. Para solucionar esto, utilicé técnicas como el análisis de correlación y la selección de características para determinar las variables más relevantes. También aprendí a utilizar técnicas de visualización para explorar los datos y descubrir patrones o tendencias que me permitieran identificar las variables más relevantes.
Finalmente, he tenido problemas para dar con un modelo válido para el problema y ajustar sus parámetros para obtener los mejores resultados posibles. Aprendí que existen diferentes modelos disponibles para resolver un problema específico y que es importante elegir el que mejor se adapte al conjunto de datos y al problema en cuestión. También aprendí la importancia de ajustar los parámetros del modelo para obtener los mejores resultados posibles, y que este proceso es una parte importante del proceso de aprendizaje automático.
En resumen, esta práctica me permitió aprender sobre la importancia de encontrar un conjunto de datos válido, preparar los datos correctamente, detectar las variables más relevantes, y seleccionar un modelo válido para el problema y ajustar sus parámetros. También me enfrenté a varias limitaciones, como la dificultad para detectar variables relevantes y la dificultad para ajustar los parámetros del modelo, y aprendí a solucionar estos problemas a través de técnicas específicas.